Objective c 如何阻止NSImage lockfocus在NSO操作中泄漏内存?

Objective c 如何阻止NSImage lockfocus在NSO操作中泄漏内存?,objective-c,memory-leaks,osx-lion,nsoperation,nsimage,Objective C,Memory Leaks,Osx Lion,Nsoperation,Nsimage,当我使用锁定/解锁焦点绘制NSImages时,我遇到了NSImages内存泄漏的问题。当我注释掉下面代码中的漏洞时,漏洞就消失了。所以我知道这就是泄漏发生的地方 for(int i= 0; i < nNumberImages; ++i) { m_apNSImageArray[i]= [[NSImage alloc] initWithSize:m_viewRect.size]; if(!m_apNSImageArray[i]) { re

当我使用锁定/解锁焦点绘制NSImages时,我遇到了NSImages内存泄漏的问题。当我注释掉下面代码中的漏洞时,漏洞就消失了。所以我知道这就是泄漏发生的地方

for(int i= 0; i < nNumberImages; ++i)
{
    m_apNSImageArray[i]= [[NSImage alloc] initWithSize:m_viewRect.size];        
    if(!m_apNSImageArray[i])
    {
        return;
    }  

    //LEAKS IN THIS CODE HERE
    [m_apNSImageArray[i] lockFocus];

    //EDIT: Commented the lines below out, but leak persists.    
    //[[[[NSApp delegate] getColors] getAudioWaveColor:YES] setStroke];        
    //[[m_pmaBezierPaths objectAtIndex:i] stroke];    

    [m_apNSImageArray[i] unlockFocus];      
    //TO HERE        
}
for(int i=0;i
我使用的是垃圾收集,而这个for循环是OSX 10.7中NSOperationQueue中运行的NSOperation的一部分

这是NSImage的lockfocus在后台线程/操作上的错误吗

编辑:
每次调用lockFocus时,它似乎都在分配新的空间。

我会查看您的
-getColors
-getAudioWaveColor:
方法。

我仍然不完全确定如何完全阻止泄漏,但我大幅减少了锁定焦点/解锁焦点的次数。这基本上解决了我的问题。

我有一个几乎相同的问题,需要添加一个自动释放池

非弧形:

// set up the autorelease pool
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// do image stuff
NSImage *imagemage = [[NSImage alloc] init];
[maskedImage lockFocus];
[maskedImage unlockFocus];
[image release];

// drain the autorelease pool
[pool drain];
弧:


嘿,凯勒,谢谢你的回答。这些方法非常简单,但为了测试它,我只注释了这行([[[NSApp delegate]GetColor]getAudioWaveColor:YES]setStroke];)并以相同的速率持续泄漏。如果您使用仪器检测泄漏,您应该能够看到泄漏的对象。这应该会给你一个关于它们来自哪里的线索。我使用活动监视器(AM)跟踪我的系统内存,但我只是使用仪器的泄漏工具试图找到泄漏,但它没有发现任何泄漏。考虑到我每次在AM中触发对该代码的调用时都会看到内存使用率上升,这很奇怪。如果泄漏工具没有显示内存泄漏,那么您看到的“泄漏”内存可能只是
retain
/
autorelease
d,并等待gc拾取它。嘿,DarvidsOn,您可能是对的,但是收集内存需要多长时间?你发布过这张图片吗?嗨,恰克,谢谢你的评论。我没有直接释放映像,因为我使用的是垃圾收集(gc),但在调用上面的代码之前,我确实将NSImageArray中的每个元素都设置为nil,这与gc信号收集有关。我尝试在for循环中不生成新的NSIMAGE。相反,我只做了一次,但之后我无法清除NSImageRep缓存,lockFocus unlockfocus代码仍然以相同的速率泄漏。对于那些在Swift中遇到此问题的人,可能需要使用没有“@”的autoreleasepool{}来消除诸如“检测到上下文泄漏,CoreAnalytics返回false”之类的消息对于NSImage.lockFocus()和.unlockFocus()会发生这种情况。另见
@autoreleasepool {
    NSImage *imagemage = [[NSImage alloc] init];
    [maskedImage lockFocus];
    [maskedImage unlockFocus];
}