1

連絡先の詳細を取得していて、shouldContinueAfterSelectingPersonメソッドでメモリの問題が発生しています。私はチュートリアルに従い、今週前に行いましたが、[製品]-> [分析]をクリックすると、次の3行に「オンラインで割り当てられたオブジェクトの潜在的なリーク」が表示されます。

[lastName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateOfBirth setText:birthday];

これらのエラーをクリックすると、次のように表示されます(ただし、3行目は2番のみです)。

  1. 関数'ABRecordCopyValue'を呼び出すと、保持カウントが+1のCoreFoundationオブジェクトが返されます。

  2. オブジェクトがリークしました:割り当てられたオブジェクトは、この実行パスの後半で参照されておらず、保持カウントは+1です。

完全なコードを以下に示します。

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

[firstName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty)];

[lastName setText:(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM d, yyyy"];
birthday = [dateFormatter stringFromDate:(__bridge NSDate *)ABRecordCopyValue(person, kABPersonBirthdayProperty)];
[dateOfBirth setText:birthday];

これに関する修正はありますか?それを修正することはどれほど重要ですか?コード内のオブジェクトのリークの可能性がもう1つあります。

最後の注意:私はARCを使用しています。

4

2 に答える 2

8

あなたはこれを求めている:

[lastName setText:(__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];

アナライザーからの警告が表示される理由は、保持カウントが+1ABRecordCopyValueのaを返すためです。次に、オブジェクトの所有権を取得しないようにARCCFStringRefにキャストします。NSString*つまり、リリースに自動的に追加されることはありません。したがって、を使用して行われるObjective-Cオブジェクトランドへのキャスト中に所有権を取得するようにARCに指示する必要があります__bridge_transfer

次のこともできます。

CFStringRef string = ABRecordCopyValue(person, kABPersonLastNameProperty);
[lastName setText:(__bridge NSString *)string];
CFRelease(string);
于 2012-07-21T17:13:12.477 に答える
1

関数は新しいオブジェクトを返しているので(名前にコピーがあります)、何らかの方法でそれらのオブジェクトを解放する必要があります。

これは、適切なメソッドを呼び出して解放するか、__bridge_transferの代わりにを使用して実行できます。これは__bridge、ARCにメモリ管理を引き継ぎ、必要に応じて解放するように指示します。

于 2012-07-21T17:14:55.080 に答える