0

次のコード行を使用しています...

NSString *clientFirstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

Xcode の「分析」機能は、これが潜在的なメモリ リークを引き起こすと言っています。私は clientFirstName をまったくリリースしていないallocか、リリースしていませんretain

ただし、ABRecordCopyValue はコマンドのようにオブジェクトを返さない可能性があることを認識しています[NSMutableArray arrayWithArray:someArray]。これは、私が制御して解放する必要がある新しいオブジェクトを実際に作成していることを意味する可能性があります。

感想を聞くのが得意...

4

3 に答える 3

3

どのような種類のコピーでも、aが1のオブジェクトが返されるため、を介してオブジェクトを返すretainCount必要があります。releaseCFRelease()

ドキュメントを参照してください:

このオブジェクトを解放するのはあなたの責任です。

于 2012-04-15T14:03:46.307 に答える
1

このリンクを参照してください。それはあなたのものと同じです:

NSStringの潜在的なリーク

KennyTMの回答を参照してください:

ABMultiValueCopyValueAtIndex「ルールの作成」に続く「コピー」機能 です。CFReleaseあなたはそれを使い終わった後にそれを解放するために呼び出す必要があります。

NSString *contactEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailInfo, 0);
...
if (contactEmail != nil)
  CFRelease((CFTypeRef) contactEmail);

clientFirstNameを使用してオブジェクトを解放しますCFRelease

以下のコードを追加します。

if(clientFirstName != nil)
{
     CFRelease((CFTypeRef) clientFirstName);
}

注:clientFirstNameがnilでないかどうかを確認することを忘れないでください。nilこの場合ではありませんが、多くの場合、潜在的なクラッシュから私たちを救うので、オブジェクトに対して関数を実行する前にオブジェクトがないことを確認する練習をすることをお勧めします

編集:

また、@ Dondragmerが以下のコメントの1つで述べているように:

私も

[clientFirstName release];

問題を解決する必要があります。

さらにサポートが必要な場合はお知らせください。

これがお役に立てば幸いです。

于 2012-04-15T14:23:42.227 に答える
0

ObjectiveC の参照カウントがどのように機能するかを完全には理解していませんが、コードの小さな更新により Analyze 警告が修正されました。

前:

NSString *firstName = (__bridge NSString*) ABRecordCopyValue(person, kABPersonFirstNameProperty);

NSString *firstName = (__bridge_transfer NSString*) ABRecordCopyValue(person, kABPersonFirstNameProperty);
于 2015-04-08T12:29:32.247 に答える