Objective c | NSArray objectEnumerator |中存在内存泄漏?

Objective c | NSArray objectEnumerator |中存在内存泄漏?,objective-c,xcode,cocoa,memory-management,Objective C,Xcode,Cocoa,Memory Management,以下线程说明如何查找当前包含鼠标光标的屏幕: 我在每一个鼠标动作上都有这个 不幸的是,使用Xcode的Instruments工具中的“Allocations”功能,上面的代码显示了NSFastEnumeration的许多alloc 分析仪中未出现“泄漏”,但alloc计数持续上升且从未下降。该应用程序的总体内存使用量也在继续上升 对于(…)循环使用的类似函数没有相同的问题 我能做些什么来提高这里的性能吗?还是我不该担心的事 编辑: 顺便说一下,尝试[[[NSScreen screens]obj

以下线程说明如何查找当前包含鼠标光标的屏幕:

我在每一个鼠标动作上都有这个

不幸的是,使用Xcode的Instruments工具中的“Allocations”功能,上面的代码显示了
NSFastEnumeration
的许多alloc

分析仪中未出现“泄漏”,但alloc计数持续上升且从未下降。该应用程序的总体内存使用量也在继续上升

对于(…)循环使用
的类似函数没有相同的问题

我能做些什么来提高这里的性能吗?还是我不该担心的事

编辑:


顺便说一下,尝试
[[[NSScreen screens]objectEnumerator]autorelease]
会使应用程序崩溃,并完全锁定我的鼠标。无法单击或以其他方式找到退出应用程序或Xcode的方法。需要重新启动OSX。所以不要那样做

你可以尝试两件事;不确定哪一个会有帮助,或者他们是否会有帮助

第一,使用实际的快速枚举语法:

for( NSScreen * screen in [NSScreen screens] ){
    if( NSMouseInRect(aPoint, screen.frame, NO) ){
        return screen;
    }
}
或者将其包装到您自己的自动释放池中,以帮助尽快释放创建的数组和枚举器对象

NSScreen *screen = nil;
@autoreleasepool{
    NSEnumerator *screenEnumerator = [[NSScreen screens] objectEnumerator];
    while ((screen = [screenEnumerator nextObject]) && !NSMouseInRect(aPoint, screen.frame, NO));
    [screen retain];    // Ensure screen sticks around past return; only under MRR
}
return [screen autorelease];

您可以尝试使用块,和/或将其包装在自动释放池中,例如:

__block NSScreen *retVal = nil;
[[NSScreen screens] enumerateObjectsWithOptions:NSEnumerationConcurrent 
     usingBlock:^(Screen *scrn, NSUInteger idx, BOOL *stop) {
         if (NSMouseInRect(aPoint, scrn.frame, NO)) {
           retVal = scrn;
           *stop = YES;
     }];
return retVal;
我能做些什么来提高这里的性能吗

我不知道您为什么认为存在性能问题。分析仪显示没有泄漏,因此除非有故障(不幸的是,这些天并非不可能),否则可能没有泄漏


如果将代码包装在自动释放池中,则应解除分配
nsfastnumerations

问题是:“……alloc计数一直在增加,从不减少。”严格来说,这不是“泄漏”,而是内存使用问题,我认为这就是提问者所做的(尽管他错误地称之为“分析器”)。你所说的“Xcode的分析器工具”是指仪器吗?Instruments与Clang静态分析器非常不同,静态分析器无法检测运行时堆积的私有实现细节对象,因为运行时还没有发生。没错,Instruments的“分配”工具。我将编辑问题。
objectEnumerator
不会返回您拥有的对象;你可以从它的名字看出来。因此,向该对象发送
autorelease
是错误的。
__block NSScreen *retVal = nil;
[[NSScreen screens] enumerateObjectsWithOptions:NSEnumerationConcurrent 
     usingBlock:^(Screen *scrn, NSUInteger idx, BOOL *stop) {
         if (NSMouseInRect(aPoint, scrn.frame, NO)) {
           retVal = scrn;
           *stop = YES;
     }];
return retVal;