3

次のように定義された 2 つのプロパティがあるとします。

@property (nonatomic, strong) UITableView *parentTableView;
@property (nonatomic, strong) NSMutableArray *headersArray;

そして方法:

-(void)prepareTags;

そして、次のようなinitメソッドがあるとします:

-(id)initWithParentTableView:(UITableView*)parentTable
{
    if(self = [super init])
    {
        //1
        NSMutableArray *array = [[NSMutableArray alloc] init];
        headersArray = array;
        //2
        self.parentTableView = parentTable;
        //3
        [self prepareTags];
    }
    return self;
}
  1. これは、init メソッドでヘッダー配列を設定する正しい方法ですか?
  2. self.parentTableViewinit メソッドから呼び出すことはできますか?
  3. init メソッドからメソッドを呼び出すことはできますか (この場合、prepareTags メソッドも呼び出しselfますself。init メソッドがまだ戻っていなくても、すぐに使用できますか?
4

3 に答える 3

5

それぞれ(リストの書式設定を使用しますが、引用符で機能させることはできません...!):

これは、init メソッドでヘッダー配列を設定する正しい方法ですか?

はい、しかしarray変数を持っている意味はありません。headersArray = [[NSMutableArray alloc] init];

メソッドself.parentTableViewから呼び出すことはできますか?init

いいえ、実用的なメモリ管理に関するAppleのドキュメントを引用するには:

初期化メソッドと dealloc でアクセサー メソッドを使用しない

. ivar に直接アクセスする必要があります ( の場合と同様headersArray) 。

メソッドからメソッドを呼び出すことはできますかinit(この場合、prepareTagsメソッドも呼び出しselfます。メソッドがまだ返されていなくselfても、すぐに使用できますか?init

はい。十分に注意してください (オブジェクトが完全に初期化されていない可能性があります。以前の制限に準拠するためにアクセサ メソッドを使用しないでください)。

于 2012-04-23T23:03:27.873 に答える
2

ここでローカル変数を使用する必要はありません。

NSMutableArray *array = [[NSMutableArray alloc] init];
headersArray = array;

インスタンス変数に直接割り当てるだけです:

headersArray = [[NSMutableArray alloc] init];

init メソッドから self.parentTableView を呼び出すことはできますか?

はい、一部の人々はそれを貧弱なデザインと考えるかもしれません. プロパティには、他のインスタンス変数を参照する複雑な setter メソッドが含まれている場合があるという事実を考慮してください。オブジェクトが完全に初期化されていないときにこれを行うのは賢明ですか?

init メソッドからメソッドを呼び出すことはできますか?

同上。まだ初期化していないものに依存しない限り、問題ありません。

于 2012-04-23T23:05:03.360 に答える
0

コードはかなり良さそうです。いくつかのメモ...

-(id)initWithParentTableView:(UITableView*)parentTable
{
    // avoid compiler warning about the assignment and the condition in the same statement
    self = [super init];
    if(self)
    {
        //1
        // no need for the extra stack variable
        self.headersArray = [[NSMutableArray alloc] init];

        //2
        // this is all fine from here
        self.parentTableView = parentTable;
        //3
        [self prepareTags];
    }
    return self;
}
于 2012-04-23T23:02:40.570 に答える