があなたのクラスのインタフェースで定義されたポインタmyView
を持って言う:
@interface MyClass {
UIView *myView;
}
@end
次に、あなたのコードでは、いくつかの点で、あなたはその変数を解放することがあります。
[myView release];
これを実行すると、ポインタmyView
はnilを指していなくても、もはや存在しないオブジェクトのメモリアドレスを指しますあなたはそれをリリースしました)。したがって、後で何かをした場合:
[myView addSubview:otherView];
エラーが発生します。
一方で、あなたがこれを行う、場合:nilにメッセージはを無視しているのでaddSubview
へ
[myView release];
myView = nil;
...
[myView addSubview:otherView];
コールは、任意の負の影響を与えることはありません。
当然の結果として、次のような、retain
プロパティを使用しての提案が表示されることがあります
@property(retain) UIView *myView;
し、コードでは、単に実行します。
self.myView = nil;
それを行うことによって、合成されたアクセサを古いオブジェクトを解放し、1行のコードでnilへの参照を設定します。これは、すべてのプロパティが解放され、nilに設定されていることを確認したい場合に便利です。
メモリ管理はretain
release
コールで行い、nilを割り当てることではないことを忘れてはなりません。保持カウント1のオブジェクトがあり、その変数にnilを代入すると、メモリがリークします。
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!
出典
2009-11-03 23:50:37
pgb
すべての熱心なココアプログラマーがこれを読んでください。私はKochan、Hillegass、Appleのドキュメントを読んできましたが、pgbがここで説明した概念のいくつかを理解するのに6ヶ月もかかりました。今私には明らかですが、確かに以前はありませんでした。投票++ – refulgentis
すばらしい答え!!!どうもありがとうございます。 –