2012-02-14 15 views
2

メモリ管理、カスタムサブクラスで独自のサブクラスのカスタムinitメソッドを書く正しい方法、および配列。objective-cのinitメソッドでself.propertyを使用する方法、initメソッドで配列を初期化する方法

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSMutableArray *array; 
@property (nonatomic, retain) SomeSubclassOfNSObject *object; 

@interface SomeSubclassofNSObject 
@property (nonatomic, retain) NSString *category; 

私のinitメソッドの記述方法は?

は、あなたが実行します。

initWithName:(NSString *)aName object:(SomeSubclassOfNSObject *)anObject { 
    if (self = [super init]) { 
     self.name = aName; // or do you do name = aName or name = [aName copy] autorelease] or name = [NSString alloc] initWithFormat:@"%@", aName] 
     self.object = anObject; // do I need to make a copy of this object so they don't point to the same object? 

    // loop through NSMutableArray and copy the objects? 
    // not really sure what to do for arrays.  
    } 
    return self; 
} 

答えて

0
  1. これは、生成されたセッターを利用していますので、保持カウントが暗黙的に増加されるので、私はほとんどの場合self.name = aName;をお勧めします。つまり、initの発信者がaNameであれば、あなたの参照は安全です。同じことがdeallocのカウンターパートにも当てはまります。self.name = nil;と書いてください。

    NSMutableStringを提供している場合は、クラス内の変更がこのクラスへの他のクラスの参照に影響を及ぼすため、異なる場合があります。しかし、デザインビューから、変更可能な文字列は、それらが操作されることを意図している場合にのみ、パラメタとして使用する必要があります。

  2. self.object = anObject;:あなたの望むものによって異なります。すべてのクラスが同じオブジェクトを指している必要がある場合は、コピーを作成しないでください(これは、しばしばあなたが望むものです)。深いコピーを作成することが合理的な場合があります。

  3. 配列:initメソッドにarray = [[NSMutableArray alloc] init];のようなものが必要です。その後、追加するオブジェクトごとに保持カウントが自動的に増分されます。つまり、追加されたオブジェクト自体にretainを呼び出さないでください。 2.同様に、ソース配列のオブジェクトのコピーを実際に作成したい場合もあります。 OKですが、これはまれです。

    多くの場合、既存の配列があり、サブ配列または特殊なソート済みバージョンが必要です。あなたは新しい配列を持っていますが、同じ要素を持っています。

これは短い答えでした。

Advanced Memory Management Programming Guide

Declared Properties

:このについての詳細
関連する問題