1

連絡先から名前と名前を取得し、NSStringのいくつかに値を保存しようとしています。

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
self.stName = (NSString *)cfName;
CFRelease(cfName);
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
self.stLastname = (NSString *)cfLastname;
CFRelease(cfLastname);

問題は、連絡先で名または姓が空の場合、CFStringRefを解放すると、アプリがEXC_BAD_ACCESS(ゾンビ?)でクラッシュすることです。CFStringRefをリリースしないと、リークが発生します。

任意の提案をいただければ幸いです。

マックス

4

1 に答える 1

0

はい、引数を渡すCFReleaseとクラッシュします( )。haltNULL

これはすでにここのsboothによって言及されました。

CFReleaseこのように見えます:

void CFRelease(CFTypeRef cf) {
    if (NULL == cf) HALT;  //this line will get you 
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED
    if (CF_IS_COLLECTABLE(cf)) {
        if (CFTYPE_IS_OBJC(cf)) {
            // release the GC-visible reference.
            auto_zone_release(auto_zone(), (void*)cf);
        } else {
            // special-case CF objects for better performance.
            _CFRelease(cf);
        }
        return;
    }
#endif

ソース

したがって、合格したかどうかを確認するのはあなたの責任ですNULL

あなたは(削除された)答えが正しかった。コードは次のようになります。

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
self.stName = (NSString *)cfName;
if (self.stName) CFRelease(cfName);
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
self.stLastname = (NSString *)cfLastname;
if (self.stLastname) CFRelease(cfLastname);

それでもコンパイラの警告が表示される場合がありますが、このコードは正常に機能するはずです。

于 2013-01-21T22:23:31.953 に答える