0

これは、変更を保存した後にアドレス帳をリロードする機能です。

self.addressbook=ABAddressbookCreateWithOptions()

self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook)

潜在的なメモリ リーク ポイントとして表示されます。

contactAdd はタイプ CFAr rayRef であり、アドレス帳はABAddressBookRef

  -(void)reloadAddressBook
    {
    //   if(self.addressBook)
    //       CFRelease(self.addressBook);
       self.addressBook = ABAddressBookCreateWithOptions(NULL,NULL);
        if(ABAddressBookHasUnsavedChanges(self.addressBook))
        {

            ABAddressBookSave(self.addressBook,NULL);
        }
    //    if(self.contactAdd)
    //        CFRelease(self.contactAdd);

        self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook);
    }
4

3 に答える 3

2

別の変数を使用して、このように割り当てます

contactAddtemp=ABAddressBookCopyArrayOfAllPeople(self.addressBook); 
self.contactAdd=(__bridge_retained CFArrayRef) CFBridgingRelease(contactAddtemp); 

xcode 4.2では機能しましたが、4.6で機能しないことを確認したところ、ABAddressBookCreate()の代わりにABAddressBookCreateWithOptions(NULL、NULL)を使用している可能性があります

于 2013-08-02T12:09:58.117 に答える
0

Core Foundation では、Create 関数と Copy 関数は所有権参照を返します。

CFRelease返されたオブジェクト (アドレス帳、人々 の配列、およびそのような関数から取得するその他すべて) を呼び出すか、次のようにキャストする__bridge_transfer(または を呼び出すCFBridgingRelease)ことによって、バランスを取る必要があります。

self.addressBook = CFBridgingRelease(ABAddressBookCreateWithOptions(…));
于 2013-08-03T04:31:48.690 に答える