Однако по возвращении ни один из кодов вообще не проверяет, существует ли объект. Но нужно ли его проверять и как его можно обрабатывать?
Как правило, обработка ошибок игнорируется подклассами, когда возвращается nil
. Обработка ошибок обычно предоставляется вызывающему абоненту, когда возвращается nil
. Как показано в идиоматической -init
:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
А также, если основание перераспределяет в init
self
, то self
переназначается (self = [super init];
). прекрасно работает.
Если вы не назначить self
результату инициализаторе super
«s или, если вы не проверить nil
, то вы можете быть держась за висящей/высвобождены указатель (EXC_BAD_ACCESS
), и вы не можете инициализировать Ивар (вы фактически назначили бы их другому региону, если не было встречено EXC_BAD_ACCESS
).
Два случая более подробно:
не удается назначить самостоятельно
- (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;
}
Сбой для проверки нулевой
- (id)init {
self = [super init];
// super returned nil. ivar is an invalid region:
ivar = 1;
return self;
}
и да, я видел оба эти.
Если объект не может существовать, значит ли система серьезно из памяти, и даже появляться сообщение об ошибке будет также невозможно?
Совсем нет. Многие инициализаторы возвращают nil
, чтобы сказать, что «не может сделать в этом контексте», или если есть простая ошибка параметра.
Это на самом деле довольно хороший вопрос. Я знаю, что я никогда не проверяю, не получил ли я что-то из результата такой функции, я просто предполагаю, что работа alloc/init работала (если только не работала с чем-то, что принимает & error, что представляет собой что-то, что может привести к сбою). Очень интересный вопрос. – RonLugge
Возможный дубликат [In Objective-C, почему я должен проверить, является ли self = \ [super init \] не нулем?] (Http://stackoverflow.com/questions/1287950/in-objective-c-why-should- i-check-if-self-super-init-is-not-nil) – omz