0

最近iOSプログラミングを始めたばかりで、Objective-Cの参照カウントを理解していると思いましたが、理解していなかったようです...次のコードは完全に実行されますが、後でアプリがクラッシュしEXC_BAD_ACCESSます(コード1またはコード2)。

ARC(PhoneGapベースのプロジェクト)を使用していません。

for(int i = 0; i < 10; ++i)
{
    UIImage *a = [UIImage imageNamed:@"NavigationBarBackButtonBlack.png"];
    UIImage *b = [a resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 7)];
    NSLog(@"a has %d retains, b has %d retains, a==b == %d\n", [a retainCount], [b retainCount], a==b ? 1 : 0);
    [a release];
    [b release];
    NSLog(@"#%d\n", i);
}
NSLog(@"FINISHED\n");

出力は私が期待する通りです:

a has 1 retains, b has 1 retains, a==b == 0
#0
a has 1 retains, b has 1 retains, a==b == 0
#1
a has 1 retains, b has 1 retains, a==b == 0
[...snip...]
a has 1 retains, b has 1 retains, a==b == 0
#9
FINISHED

ここでの問題は何ですか?自動リリースが行われていますか、それともキャップされた画像が元の画像への参照を保持していますか?わからない。

4

2 に答える 2

3

imageNamedresizableImageWithCapInsets両方とも自動解放されたオブジェクトを返します。それらを手動で解放しないでください。

言い換えれば、あなたがそうしなかったalloccopyまたはretainそれをしなかったなら、あなたはそれをすべきではありませんrelease

そして最後のヒントとして:プロパティを忘れてくださいretainCount、それはあなたにとって役に立たないです。

于 2012-07-20T10:03:49.537 に答える
2

イメージaとbをリリースしないでください。それらの画像は自動リリースされます。allocキーワードまたはを使用する場合にのみ、オブジェクトの解放を実行する必要がありますnew

これは、ObjectiveCでのメモリ管理のかなり良い入門書です。

http://interfacelab.com/objective-c-memory-management-for-lazy-people/

于 2012-07-20T10:03:40.257 に答える