2010-11-25 13 views
1

通常、オブジェクトを作成してインスタンス変数に代入すると、tempオブジェクトを割り当てます。オブジェクトを保持するためにiVarセッターを呼び出し、tempオブジェクトを解放します。しかし、私は今朝initを見ていて、単にiVarを直接割り当てると、setterが呼び出されるかdeallocが実行されたときに正しく解放されている間にallocによって保持されることに気付きました。私がこれを正しく理解しているのであれば、私はちょうど興味がありますか?メモリ管理とインスタンス変数?

@property(nonatomic, retain) CLLocationManager *locationManager; 

@synthesize locationManager; 

// VERSION 001 
- (id)init { 
    self = [super init]; 
    if(self) { 
     CLLocationManager *tempManager = [[CLLocationManager alloc] init]; 
     [self setLocationManager:tempManager]; 
     [tempManager release]; 
    } 
    return self; 
} 

// VERSION 002 
- (id)init { 
    self = [super init]; 
    if(self) { 
     locationManager = [[CLLocationManager alloc] init]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 

答えて

1

バージョン002はAppleが承認した答えです。なぜなら、initでアクセサを使用することの落とし穴は理論的に悪いからです。基本的に、サブクラスはあなたのアクセサをオーバーライドすることを選択でき、まだ初期化されていないサブクラスオブジェクトにメッセージを送信します。

しかし、他のどこでもinitとdeallocを除いて、使用バージョン001

+0

非常に明確な答えをありがとう、非常に感謝します。 – fuzzygoat

2

メモリの管理がうまくいく限り、両方の解決策は問題ありません。しかし、initdeallocの直接アクセスを希望したい場合は、this related questionを参照してください。

+0

私は、同様のinitにそれらを使用すべきではないことを知って前の質問、その良いからのdeallocでセッターを使用していないのに気づいていました。ですから、私はinitとdellocがv_002のようなiVarsを直接割り当てるのは間違いありません。他のメソッドでは、allocオブジェクトを使うのが一番ですが、setterを使ってiVarを割り当て、最後にオブジェクトを解放してください。 – fuzzygoat