2012-04-26 6 views
6

私はそれらが存在すると確信していますが、ViewControllerでコンセントを宣言するための公式のベストプラクティスを見つけたり固定したりするのが難しいです。IBOutletsはivarsか特性かどうか?

3つのオプションは、これまでのところ、私が見ることができるようにあります。

  1. IVARのみ
  2. プロパティのみ
  3. プロパティ私がしようとすると、

Xcodeのは、現在、クラッシュIVARで裏打ちし、自動 - IBから私のViewControllerにドラッグすることによってプロパティを生成しますが、覚えていることから、ivarなしでプロパティを作成します。 ivarセクションにドラッグすることもできます。これにより、プロパティなしのivarが作成されます。これは、不動産専用とイーバー専用のアウトレットが両方ともリンゴでOKであることを示しています。

したがって、viewDidUnloadでは、私たちのアウトレットにnilを割り当てる必要がありますが、deallocについてはどうでしょうか。私たちがivarのないプロパティを使用していた場合、initまたはdeallocでアクセサーを使用しないようにするには、どうすればコンセントを解放できますか?

アクセサリーなしで私たちのコンセントを解放することができる唯一のパターンは、ivarで裏付けられたプロパティを使用しているため、アクセサーを使わずにdeallocでivarを手動でリリースすることができます。 Appleのコード生成がサポートしていない1つのオプション。

答えて

1

私は通常、IBOutletのアクセサーを作成します。あなたは、コンパイラがあなたのために、インスタンス変数を作成してみましょうことができます。このように

//.h (ARC) 
@property (nonatomic, weak) IBOutlet UILabel* myLabel; 

//.h (non-ARC) 
@property (nonatomic, retain) IBOutlet UILabel* myLabel; 

//.m 
@synthesize myLabel; 

:ARCまたは非ARCプロジェクトで

私は通常、次の操作を行います。しかし、インスタンス変数を宣言し、コンパイラにそれを使用するように指示することもできます。

次に、必要に応じてアクセサー/インスタンス変数を使用できます。

Apple Memory Management guideには、ARC以外のプロジェクトがある場合にinitまたはdeallocのメソッドでアクセサメソッドを使用しないようにする必要があります。たとえば、次のようになります。

// (non-ARC) 
- (void)dealloc 
{ 
    [myLabel release]; myLabel = nil; // I'm using the instance variable here! 
    [super dealloc];  
} 

これは非ARCプロジェクトでは非常に重要です。その理由は、アクセサがない場合、KVCはnibオブジェクトをインスタンス変数に割り当て、そのインスタンスにretainを配置するためです。リリースを忘れると、メモリリークが発生する可能性があります。アクセサを使用すると、最後にそのオブジェクトを解放するように強制します。

マイク・アッシュによるfriday-qa-2012-04-13-nib-memory-managementを強くお勧めします。これはペン先とメモリ管理に関する非常にクールな記事です。

希望します。ここで

+0

ありがとうございました。それは明確で素晴らしいリンクです。 – Undistraction

+0

@ 1ndivisibleよろしくお願いします。あなたが望むなら、アップアップしてください。乾杯。 –

+0

スーパー変数deallocへの呼び出しは、インスタンス変数releaseの後に来るべきです。 –

1

は、私の理解では、他のクラスによってアクセス、どちらか(ゲッター)から読み取るか(セッター)に書き込まれます変数のための

使用特性です。 setterとgetterの両方がプロパティ用に合成されます。

所有クラスのみで内部的に使用される変数にivarsを使用します。つまり、他のクラスは値を設定または取得しません。

もちろん、ivarsの代わりにプロパティを使用できますが、アクセスするたびに関数呼び出しのオーバーヘッドが発生します。したがって、クラスによってLOTにアクセスされる内部変数がある場合、関数呼び出しはリアルタイムのパフォーマンスに影響を与えます。これはivarsとして宣言することで回避できます。

関連する問題