2
CFArrayRef refAllPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
NSArray * arPeople = (__bridge_transfer NSArray*)(refAllPeople);

分析すると、メモリリークの可能性があると表示されます。

理解してみましょう。refAllPeople の参照カウントは 1 です。

次に、_bridge_transfer を実行します。それは私に所有権を移します。より正確には、arPeople がそれを指しており、保持カウントが 1 加算されます。_ bridge _transfer は (__bridge) の後に CFRelease が続くのと同じであるため、保持カウントが 1 減ります。

そう、

メモリリークの苦情はなぜですか?

4

2 に答える 2

6

あなたの理解は正しいです。__bridge_transferは動作する場所refAllPeopleの世界に戻り、明示的に呼び出す必要はありません。NSObjectARCCFRelease

静的アナライザーの間違いだと思います。

ドキュメントから(カールに感謝)

(__bridge_transfer T) op は、保持不可能なポインター型である必要があるオペランドを、保持可能なオブジェクト ポインター型である必要がある宛先の型にキャストします。ARC は、ローカル値の通常の最適化に従って、囲んでいる完全な式の最後で値を解放します。

于 2013-03-29T05:53:30.063 に答える
1

恥ずかしいです。メモリリークはありません:)。どういうわけか、エラー メッセージを読み間違えて、青色のものはすべてメモリ リークを意味していると思います。

bridge_transfer についての私の理解が正しいことをうれしく思います。皆様のお役に立てば幸いです。

これに答えた他の人には+1 :)

于 2013-03-29T06:06:09.637 に答える