Для создания этого более ясным, что я говорю о вот, пример.
Наличие этого класса:
@interface Person : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
- (void)sayHi;
@end
с этой реализацией:
@implementation Person
@synthesize name;
- (void)dealloc {
[name release];
[super dealloc];
}
- (void)sayHi {
NSLog(@"Hello");
NSLog(@"My name is %@.", name);
}
@end
Где-нибудь в программе я делаю это:
Person *person = nil;
//person = [[Person alloc] init]; // let's say I comment this line
person.name = @"Mike"; // shouldn't I get an error here?
[person sayHi]; // and here
[person release]; // and here
Сообщение, отправленное объекту nil
, совершенно приемлемо в Objective-C, оно рассматривается как бездействие. Невозможно пометить это как ошибку, потому что это не ошибка, на самом деле это может быть очень полезной функцией языка.
Из документов :
Отправка сообщений в ноль
В Objective-C допустимо отправлять сообщение в ноль - это просто не имеет никакого эффекта {{ 1}} во время выполнения. В Какао есть несколько шаблонов , которые используют этот факт . Значение, возвращаемое из сообщения в nil, также может быть допустимым:
Если метод возвращает объект, то сообщение, отправленное на
nil
, возвращает0
(nil
), например:
Person * motherInLaw = [[aPerson супруга] мать];
If
aPouse
супруга
равноnil
, тогдамать
отправляется наnil
, а метод возвращаетnil
.Если метод возвращает любой тип указателя, любой целочисленный скаляр размера меньше или равного
sizeof (void *)
, afloat
,double
,long double
, илиlong long
, затем сообщение отправлено наnil
возвращает0
.Если метод возвращает
структуру
, как определено в руководстве по вызову функций Mac OS X ABI , которая должна быть возвращена в регистрах , то сообщение отправляется в {{ 1}}nil
возвращает0,0
для каждого поля в структуре данных.Другие типы данныхstruct
не будут заполняться нулями .Если метод возвращает что-либо, кроме вышеупомянутого значения types, возвращаемое значение сообщения , отправленного в nil, не определено.
Одна вещь, которую вы должны уяснить, - это то, что в Objective-C вы не вызываете метод для объекта, вы отправляете сообщение объекту. Среда выполнения найдет метод и вызовет его.
Начиная с первых версий Objective-C, сообщение о nil всегда было безопасным отказом от операции, возвращающим nil. От этого поведения зависит много кода.