2012-02-10 8 views
1

私は、Objective-Cでの特性を割り当てるに関する以下の質問を、持っているのObjective-Cでプロパティを割り当て

私は、次のプロパティを使用している場合:

@property (nonatomic, retain) NSArray *arr; 
@synthize arr=_arr; 

は、私のようなこの配列を割り当てる必要があります

arr=[[NSArray alloc]init]; 

もし私がそうしなければならない場合、それを割り当てるのに最適な場所はどこですか?

私はそれをリリースすべきだと知っていますが、プロパティを保持すると、保持カウントが1増加し、それを割り当てることで別の1に増加します。

次の2つの方法で配列を割り当てることができます

答えて

5

:このように、

  1. 保持値と直接IVARを設定します。

    _arr = [[NSArray alloc] init]; 
    
  2. このような自動解放値でプロパティを設定します。

    self.arr = [NSArray array]; 
    

あなたはクラスのinitメソッドでこれを行うことができますが、どのスーパークラスがこれを使用しているのかはわかりませんが、initメソッドの見た目はわかりません。それはNSObjectのなら、それは次のようになります。

- (id)init 
{ 
    if ((self = [super init])) 
    { 
     self.arr = [NSArray array]; 
    } 
    return self; 
} 

しかし、それはのUIViewControllerだ場合、あなたはinitWithNibName使用する必要があります:このように、バンドルを:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil 
{ 
    if ((self = [super itWithNibName:nibNameOrNil bundle:bundleOrNil])) 
    { 
     self.arr = [NSArray array]; 
    } 
    return self; 
} 

次に、あなたはそれを解放する必要がありますあなたのdeallocメソッドでは、次のように:それらが作成されていたら、あなたはおそらくどちらかが、このようないくつかのオブジェクト、でそれを初期化したいので、しかし

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

、あなたは、NSArraysを変更することができないことを心に留めてください。

self.arr = [NSArray arrayWithObjects:object1, object2, nil]; 

それとも、後でそれにオブジェクトを追加したい場合は、このように、NSMutableArrayのように定義する必要があります。

@property (nonatomic, retain) NSMutableArray *arr; 

し、それを初期化:

意志
self.arr = [NSMutableArray array]; 

後でオブジェクトを追加することができます。

ところで、deallocメソッドでエラーが発生した場合は、プロジェクトがiOS 5の新技術であるARCを使用している可能性があります。つまり、リリースと保持ステートメントをもう書き留める必要はありません。

ARCを使用していない場合は、この保持/解放のことを心配する必要がないため、そうすることをお勧めします。今すぐ始めているiOSデベロッパーはすべてのプロジェクトで本当にARCを使用する必要がありますそれはiOS 5でしか紹介されていませんでしたが、Objective-Cの書籍の多くはそれをカバーしていません。

+0

配列をdeallocで解放するもう1つの安全な方法は、 'self.arr = nil;'です(プロパティにretain属性がある限り) – MechEthan

+1

プロパティのゲッターをオーバーライドすることによって、遅延を初期化することもできますおそらく、これを単純なもので行う理由はあまりありません。 –

+2

@yAak実際には、プロパティにも割り当て属性がある場合は、self.arr = nilを使用すると問題ありません。あなたがdeallocでsetterメソッドを呼び出すのは避けなければならないという考えの学校があります。なぜなら、コンセンサスに達することなくそれについて論じる人々のスタックオーバーフローに関する全体的なディスカッションスレッドを見つけるからです:-) –