27

簡単な質問...Objective-C ではすべてのプロパティが nil として開始され、nil にメッセージを送信しても何も起こらないことを理解しています。したがって、[[Class alloc] init]; を使用して初期化する必要があります。新しく作成されたプロパティにメッセージを送信する前。ただし、このプロパティにメッセージを送信していない場合や、self.property = something を使用してプロパティを設定した場合はどうでしょうか? これらの場合も init を割り当てる必要がありますか? また、ストーリーボードからドラッグした UILabel プロパティなど、UI プロパティも nil として開始されますか? これらには alloc init が必要ですか?

答えてくれてありがとう

4

4 に答える 4

40

Stunner は、既に作成されている init オブジェクトを割り当てる必要がないことをうまく説明しました。

しかし、それが存在しないオブジェクトである場合、どこで作成するのでしょうか? あなたが投稿で言及したので言及する非常に一般的なパターンは、遅延インスタンス化です。

したがって、NSMutableArray プロパティが必要です。使用する前に何らかのメソッドで初期化を割り当てることができますが、「配列が必要になる前にそのメソッドが呼び出されるかどうか」について心配する必要があります。または「誤ってもう一度呼び出して、再初期化するつもりですか」。

したがって、それを行うためのフェールセーフな場所は、プロパティのゲッターにあります。プロパティにアクセスするたびに呼び出されます。

.h
@property (nonatomic, strong) NSMutableArray* myArray;

.m
@synthesize myArray = _myArray;

- (NSMutableArray*)myArray
{
    if (!_myArray) {
        _myArray = [[NSMutableArray alloc] initWithCapacity:2];
    }
    return _myArray;
}

そのプロパティにアクセスするたびに、「myArray は存在しますか? 存在しない場合は作成してください。存在する場合は、私が持っているものを返すだけです」と表示されます。

さらに、この設計パターンの追加の利点は、リソースが必要になるまでリソースを作成しないことです。ビュー コントローラーが読み込まれたときやアプリが起動したときにリソースを一度に作成するのではなく、要件によっては数時間かかる場合があります。秒。

于 2012-08-02T02:34:47.320 に答える
4

現実にはself.myProperty = [[Class alloc] init]、プロパティを初期化していません。むしろ、プロパティ (実際にはポインター) に指示するオブジェクトを初期化しています。したがって、割り当てられて初期化されたオブジェクトが既にある場合は、再度割り当て/初期化する必要はなく、実行できますself.myProperty = object

UI プロパティは nil として開始されません。これは、インターフェイス ビルダーに要素を追加すると、追加した要素がビューに所有され、これらのオブジェクトが自動的に初期化されるためです。これは、IBOutlets を作成し、それらをいくつかのプロパティに接続する場合、割り当て/初期化する必要がないことを意味します。

これがお役に立てば幸いです。

于 2012-08-02T00:52:36.670 に答える
1

ストーリーボードの経験はありませんが、xib ファイルを使用してオブジェクトを作成すると、View Controller に xib ファイルを使用するように指示すると、すべてのオブジェクトが適切にインスタンス化されることがわかります。そのため、コードでこれらのオブジェクトの割り当て/初期化について心配する必要はありません。

の使用に関してself.property = <something>は、ものによって異なりsomethingます。何かが何らかの種類の既存のオブジェクトである場合、そのオブジェクトに対して alloc init を実行する必要はありません。これは、self.property = ...構文がプロパティのセッター メソッドを呼び出して、新しい値をプロパティに適切に保持、コピー、割り当てなどするためです。

現在、あらゆる種類の既存のオブジェクトは、割り当て/初期化されたオブジェクト、または便利なメソッド (NSString の stringWithFormat: など) から取得された自動解放されたオブジェクトにすることができます。

Kaan Dedeoglu が指摘したように、self.property = ...構文は ivar をメモリ内のオブジェクトに向ける (そして保持する) ため、まだインスタンス化されていない場合、そのオブジェクトを初期化するのはユーザー次第です。

于 2012-08-02T01:01:08.587 に答える
0

いいえ、init メソッドでプロパティを [[Class alloc]init する必要はありません。

ただし、わかりやすくするために、init メソッドで明示的に Nil に設定することをお勧めします。

于 2012-08-02T00:53:09.793 に答える