Цель C: почему этот код протекает? - PullRequest
0 голосов
/ 10 января 2011

Я пытаюсь реализовать метод, аналогичный тому, который mytunescontroller использует для проверки, был ли он добавлен в элементы входа пользователя.Этот код компилируется без предупреждений, но если я запускаю инструмент производительности утечек, я получаю следующие утечки:

Leaked Object  #    Address         Size   Responsible Library  Responsible Frame
NSURL          7    < multiple >    448    LaunchServices       LSSharedFileListItemGetFSRef
NSCFString     6    < multiple >    432    LaunchServices       LSSharedFileListItemGetFSRef

Вот виновник:

- (BOOL)isAppStartingOnLogin 
{
    LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
    if (loginListRef) {
        NSArray *loginItemsArray = (NSArray *)LSSharedFileListCopySnapshot(loginListRef, NULL);
        NSURL *itemURL;
        for (id itemRef in loginItemsArray) {           
            if (LSSharedFileListItemResolve((LSSharedFileListItemRef)itemRef, 0, (CFURLRef *) &itemURL, NULL) == noErr) {
                if ([[itemURL path] hasPrefix:[[NSBundle mainBundle] bundlePath]]) {
                    [loginItemsArray release];
                    [itemURL release];
                    CFRelease(loginListRef);
                    return YES;
                 }
             }
        }
    [itemURL release];
    [loginItemsArray release];
    CFRelease(loginListRef);

    }

    return NO;
}

1 Ответ

3 голосов
/ 10 января 2011

LSSharedFileListItemResolve() возвращает принадлежащий объект в третьем параметре. Это можно проверить, прочитав заголовок. В результате вам нужно выпустить itemURL.

...