2

このコードを使用して、ABPersonの名前を取得します

CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
CFRelease(lastNameRef);

姓の値がNULLに等しくない場合は正常に機能しますが、この値がNULLの場合、NULLを解放しようとすると、アプリケーションが3行目でクラッシュします。

問題は、この場合、アプリケーションのクラッシュを引き起こさずにCFStringを解放するための最良の方法は魔女であるということです。

4

3 に答える 3

6

ifを使用してNULLをチェックするだけです。

if (lastNameRef != NULL)
    CFRelease(lastNameRef);
于 2012-06-19T14:07:45.353 に答える
2

CFReleaseNULL以外のポインタが必要です。ステートメントでそれを確認できますが、代わりifに単純にリリースまたは自動リリースする方が簡単です。friendLastName

CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
// use friendLastName
[friendLastName release];

また

CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
[friendLastName autorelease];
// use friendLastName

を使用していないように見えるのでlastNameRef、その変数をインライン化することもできます。

NSString *friendLastName = (NSString*)ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
// use friendLastName
[friendLastName release];

また

NSString *friendLastName = (NSString*)ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
[friendLastName autorelease];
// use friendLastName
于 2012-06-19T14:18:56.223 に答える
2

CFReleaseは古いCスタイルのコードです。CFReleaseを呼び出す前にNULLをチェックする必要があります。また、CFReleaseを呼び出した後にlastNameRefをNULLに設定する必要があります。

if (lastNameRef != NULL) { CFRelease(lastNameRef); lastNameRef = NULL; }

于 2012-06-19T14:13:18.363 に答える