2017-06-20 14 views
1

を使用する場合、私は機器によって示されるように、メモリリークを引き起こす方法があります。私はCFRelease(AB)を使用する場合Memoryleak CFRelease

enter image description here

-(BOOL)checkIfGroupExistWithName:(NSString*)groupName 
{ 
    BOOL hasGroup = NO; 
    //checks to see if the group is created ad creats group for Handheld contacts 

    CFErrorRef error = NULL; 
    ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, &error); 

    CFIndex groupCount = ABAddressBookGetGroupCount(ab); 
    CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(ab); 

    for (int i=0; i<groupCount; i++) { 

     ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i); 

     CFStringRef CFcurrentGroupName = ABRecordCopyCompositeName(group); 
     NSString *currentGroupName = (__bridge_transfer NSString *)CFcurrentGroupName; 

     if ([currentGroupName isEqualToString:groupName]) { 
      //!!! important - save groupID for later use 
      groupId = ABRecordGetRecordID(group); 
      hasGroup = YES; 
      i = (int) groupCount; 
     } 
     CFRelease(CFcurrentGroupName); 
     CFRelease(group); 
    } 


    return hasGroup; 
} 

と、 return hasGroupの前に、クラッシュします。 ここで何が起こっているのか理解できませんでした。

答えて

3

静的アナライザ(シフト + コマンド + BかのXcodeの "製品" メニューの "分析")はあなたのため、これらの問題を特定するに著しく良いです:

enter image description here

ボトムCreate Ruleは、CopyまたはCreateのいずれかの名前でCore Foundation関数から返されたオブジェクトがCFReleaseであることを示しています(所有権を転送するものを除く)。 CFBridgingReleaseまたは__bridge_transferのいずれかを入力してください。言いたいこと

言うまでもなく、あなたは(あなたがすでに__bridge_transferに所有権を移転名にCopyまたはCreateなし関数によって返されたなどgroupなど、もCFcurrentGroupName、)CFRelease何かをすべきでありません。とにかく

、あなたのようなもので終わる:私は、おそらくあなたがにNSContactsUsageDescriptionを追加することを怠っ、ABAddressBookCreateWithOptionsが失敗したため、例えば、abNULLた(CFRelease(ab)へのあなたの試みは他の理由のためにクラッシュしていましたと思われる

- (BOOL)checkIfGroupExistWithName:(NSString*)groupName { 
    BOOL hasGroup = NO; 
    //checks to see if the group is created ad creats group for Handheld contacts 

    CFErrorRef error = NULL; 
    ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, &error); 
    if (!ab) { 
     NSLog(@"%@", CFBridgingRelease(error)); 
     return false; 
    } 

    CFIndex groupCount = ABAddressBookGetGroupCount(ab); 
    CFArrayRef allGroups = ABAddressBookCopyArrayOfAllGroups(ab); 

    for (int i = 0; i < groupCount; i++) { 

     ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i); 

     NSString *currentGroupName = CFBridgingRelease(ABRecordCopyCompositeName(group)); 

     if ([currentGroupName isEqualToString:groupName]) { 
      //!!! important - save groupID for later use 
      groupId = ABRecordGetRecordID(group); 
      hasGroup = true; 
      break; 
     } 
    } 

    if (allGroups) CFRelease(allGroups); 
    CFRelease(ab); 

    return hasGroup; 
} 

plier; abがリリースされました。その後はabとなりました。あなたは持ってはいけないものをリリースしていました;いくつかのCore Foundation関数からNULLを受け取りました; CFRelease;など)。しかし、前述の問題が修正されているので、上記はうまくいくはずです。

明らかに、iOS 9以降のみを使用している場合は、Contacts.frameworkを使用してこれらのブリッジング問題をすべて回避できます。

関連する問題