2011-01-11 2 views
1

deallocメソッド私は、リリース呼び出し:iPhoneのリリースの問題

NSLog(@"%d",[username retainCount]); 
[username release]; 
NSLog(@"%d",[username retainCount]); 

しかし、コンソールにそれが印刷されます。

2011-01-11 23:09:52.468 IAPP [2527:307] 1
2011-01-11 23:09:52.480 IAPP [2527:307] 1

問題は何ですか?

おかげ

答えて

3

オブジェクトはすぐに解放されません。 おそらくオブジェクトが実際にリリースされる前に実行ループサイクルが必要です。
ただし、retainCountの呼び出しは実際には意味があります。理由をお読みください:When to use -retainCount?

EDIT:@ kris-van-baelはこの回答にコメントしました - 正しく - ドキュメントに基づいて、これは真実ではありません。だから、私がここに書いたのは、この問題をiOSシミュレータでテストすることに基づいているということを明確に述べなければならない。それはどういうわけかではない。になるはずだ。

@interface Test : NSObject { } 
@property (retain, nonatomic) NSString *test; 
@end 

@implementation Test 
@synthesize test; 
@end 

を次にどこかにあなたのコードの書き込みに:しかし、それは、次のコードがエラーなしで実行されますように思わ

Test* t = [[Test alloc] init]; 
t.test = @"Test1"; 

NSLog(@"%@", t.test); 

[t release]; 

t.test = @"Test2"; 

NSLog(@"%@", t.test);  

は、この(生憎)のiOSシミュレータ上でエラーなしで実行されます(ただし、それを実行しますデバッガで段階的にクラッシュする)ので、明らかにiOSのオブジェクトの割り当てを解除するトリックがあります。

+0

これは間違っていますが、 'autorelease'はイベント処理の終了時まで延期されますが、 'release'はすぐに実行されます。 –

+0

はい。それは理論であり、すべての状況で真実でなければならない。しかし、私は小さなiOSアプリケーション(シミュレータでテスト済み)を作成しましたが、Testクラスのインスタンスを解放した後も、私はまだプロパティ値を取得できました。フレームワークがdeallocを呼び出す際にいくつかの遅れを出すようです...プログラムをステップバイステップで実行すると、正しいBAD ACESSが得られます(試してみてください)...) – Moszi

+1

'release'は即時です。問題は、 'dealloc'の後の動作が未定義であることです。このシステムは、割振り解除されたメモリに書き込むサイクルを無駄にしないので、「未定義」は「まだ半永久的」を意味する可能性があります。 – bbum

6

リリースした後、オブジェクトが破棄されるので、あなたが最初の時間を離すと、保持カウントはメモリーので1である第二時間は動作

3

を未定義た「retaincount」を呼び出します割り当てが解除されようとしているとき、保持カウントを減らす必要はないので、基になるコードは単に減分ステップをスキップしてメモリを解放することができます。

保持カウントを2回目で調べると、安全ではなく、潜在的に任意の値を返す可能性のある割り当て解除されたメモリが表示されます。 の直後であるreleaseの直後から、メモリは他のものに割り当てられていない可能性がありますが、それに関係なくアクセスする必要はありません。

4

What is the problem?

問題は、retainCountを使用しており、意味のある結果が期待されることです。

は、上記のいくつかの良い細部を持ってretainCount

When to use -retainCount?

を呼び出さないでください。だからここの答えの一つがありません:あなたはMallocScribble環境変数を設定することができ、これは、割り当てられたメモリの原因となります

https://stackoverflow.com/questions/4580684/common-programming-mistakes-for-objective-c-developers-to-avoid


注意が0xAAを配分上のバイトと解放には0x55のバイトで充填します。それに直面して、retainCountへの2回目のコールはクラッシュします。

+0

wow - このtrick.iのように試します;) – Moszi