ただし、戻ったときに、オブジェクトが存在できるかどうかをチェックするコードはまったくありません。しかし、それをチェックする必要があり、どのように処理できるのでしょうか?
nil
通常、が返されると、エラー処理はサブクラスによって無視されます。nil
通常、が返されるときのエラー処理は呼び出し元に任されます。慣用句で示されているように-init
:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
同様に、ベースが で再割り当てself
されるinit
と、self
が再割り当てされます ( self = [super init];
)。よく働く。
self
のイニシャライザの結果への割り当てに失敗した場合super
、または のチェックに失敗した場合はnil
、ぶら下がっている/割り当て解除されたポインタ ( EXC_BAD_ACCESS
) を保持している可能性があり、ivar を適切に初期化できない可能性があります (効果的にそれらを検出されなかった場合は別のリージョンEXC_BAD_ACCESS
)。
2 つのケースの詳細:
自分自身を割り当てられませんでした
- (id)init {
[super init];
if (self) {
// self was not reassigned. if super returned an object other
// than self, then our ivar would be freed, reused, or sitting
// in an autorelease pool, and the returned instance's ivar
// would not be assigned -- we wouldn't know the address.
ivar = 1;
}
return self;
}
nil のチェックに失敗
- (id)init {
self = [super init];
// super returned nil. ivar is an invalid region:
ivar = 1;
return self;
}
はい、私はこれらの両方を見てきました。
オブジェクトが存在できない場合、それはシステムのメモリが深刻に不足していることを意味し、エラー メッセージを表示することさえ不可能になるのでしょうか?
全くない。多くのイニシャライザnil
は、「このコンテキストでは実行できません」と言うか、単純なパラメータ エラーがある場合に戻ります。