2011-01-10 12 views
0

mytunescontrollerがユーザーのログイン項目に追加されているかどうかを確認するために使用する方法と似た方法を実装しようとしています。このコードは、警告なしでコンパイルが、私はリークのパフォーマンスツールを実行する場合、私は、次のリークを取得:目的C:なぜこのコードが漏れていますか?

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; 
} 
+0

forループの途中で 'return YES'を押すと、配列とrefをリークします。 –

答えて

3

LSSharedFileListItemResolve()は三番目のパラメータで所有しているオブジェクトを返します。これはヘッダーを読むことで確認できます。その結果、itemURLをリリースする必要があります。

+0

これは関数に固有のものか、または「ポインタによる返された」アイテムのrefが増えたという義務を「強制されている」ものであるか? –

+0

これは、この機能に特有のものですが、自動解放はobj-cレベルにのみ存在するため、一般にCoreFoundationレベルのAPIから期待できます。 –

+0

私はitemURLをリリースしようとしましたが、まだ漏れがあります。変更を反映するようにコードを更新しました。 – David

関連する問題