web-dev-qa-db-ja.com

Objective-Cではインスタンス変数はデフォルトでnilに設定されていますか?

私はiPhoneアプリでいくつかのメモリの問題を整理していて、いくつかの基本について考えていました。 ivarをセットアップし、オブジェクトの存続期間中にそれを使用することにならない場合、deallocを呼び出すと、問題が発生しますか?例えば。

@interface testClass {
    id myobject;
}
@property (nonatomic, retain) id myobject;
@end

@implementation testClass
@synthesize myobject;
- (id)init {
    ...
    // Do I have to set myobject to nil here?
    // So if myobject isn't used the dealloc call to nil
    // will be okay? Or can you release the variable without
    // having set every object to nil that you may may not use 
    ...
}

...

// Somewhere in the code, myobject may be set to
// an instance of an object via self.myobject = [AnObject grabAnObject]
// but the object may be left alone

...

- (void)dealloc {
    [myobject release];
    [super dealloc];
}
@end
38
56
Chuck

はい、 ivarsは常に0/nil/NULL/NO/etcに初期化されます

ただし、何が起こっているのかを理解するのに役立つ場合は、それを選択してください。パフォーマンスへの影響はごくわずかです。実行する必要はありませんが、実行しても問題はありません。

11
BJ Homer

nilメソッドでこれらのivarを常にinitに設定することをお勧めします。そうすれば、デストラクタでreleaseを呼び出しても問題が発生しないことを確信できます。

Objective-Cがそれらを自動的にnilに設定し、何らかの理由でそれらの割り当てを削除することで改善できる速度のボトルネックがあることに気付いた場合(ほとんどあり得ない)、心配することができます。それらを削除します。それまでの間、それらすべてをnilに設定して、より簡単に眠りましょう:)

pdate: BJ HomerとChuckは、ivarswillが自動的にゼロに設定されることを指摘しているため、スタイルの決定。

0
e.James