Как остановить NSImage lockfocus от утечки памяти в NSOperation? - PullRequest
3 голосов
/ 18 августа 2011

У меня проблема с утечкой памяти 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 является частью NSOperation, работающего в NSOperationQueue в OSX 10.7 Lion.

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

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

Ответы [ 3 ]

1 голос
/ 02 ноября 2015

У меня была почти идентичная проблема, и мне нужно было добавить пул автоматического выпуска.

Non-ARC:

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

ARC:

@autoreleasepool {
    NSImage *imagemage = [[NSImage alloc] init];
    [maskedImage lockFocus];
    [maskedImage unlockFocus];
}
0 голосов
/ 24 августа 2011

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

0 голосов
/ 18 августа 2011

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

...