2009-11-03 9 views
8

私は、対象となるC言語とCocoaフレームワークを使って開発しています。しかし、オブジェクト参照をnilに設定する必要があるときは、私にはまだ絶対に分かりません。デリゲートを持つオブジェクトを解放する前にそうすることをお勧めします。また、保持されているサブビューのviewDidUnloadメソッドでもそうする必要があります。しかし、正確にいつこれをやるべきなのですか?それは正確に何を達成するのですか?前もって感謝します。Objective C iPhoneでオブジェクト参照をnilに設定するとき

-Oscar

答えて

40

があなたのクラスのインタフェースで定義されたポインタ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に設定されていることを確認したい場合に便利です。

メモリ管理はretainreleaseコールで行い、nilを割り当てることではないことを忘れてはなりません。保持カウント1のオブジェクトがあり、その変数にnilを代入すると、メモリがリークします。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)]; 
view = nil; 
// You just leaked a UIView instance!!! 
+0

すべての熱心なココアプログラマーがこれを読んでください。私はKochan、Hillegass、Appleのドキュメントを読んできましたが、pgbがここで説明した概念のいくつかを理解するのに6ヶ月もかかりました。今私には明らかですが、確かに以前はありませんでした。投票++ – refulgentis

+0

すばらしい答え!!!どうもありがとうございます。 –

関連する問題