Как остановить Nsimage lockfocus от утечки памяти в NSOperation?


У меня есть проблема с утечкой памяти NSImages, когда я обращаюсь к ним с lock/unlockfocus. Утечка уходит, когда я комментирую утечки здесь код ниже. Так что я знаю, что именно там происходит утечка.

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 является частью NSOperation, запущенной в NSOperationQueue в OSX 10.7 Lion.

Это ошибка с блокировкой NSImage на фоновых потоках / операциях?

Править: Похоже, что lockFocus выделяет новые пространство каждый раз ее называло.

3 3

3 ответа:

Я бы посмотрел на ваши методы -getColors и -getAudioWaveColor:.

Ну, я все еще не совсем уверен, как полностью остановить утечку, но я резко сократил количество раз, когда я lockFocus/unlockFocus. Это, по сути, решило мою проблему.

У меня почти идентичная проблема и нужно добавить autorelease пул.

Не-Дуга:

// 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];

Дуга:

@autoreleasepool {
    NSImage *imagemage = [[NSImage alloc] init];
    [maskedImage lockFocus];
    [maskedImage unlockFocus];
}