обо всем по порядку: этот пример кода ужасен.
- (id) init
{
// assign self. super may return another address
self = [super init];
// then check for nil
if (self != nil) {
// then assign the ivar directly because you should
// not invoke methods of partially constructed objects
theAppDataObject = [[ExampleAppDataObject alloc] init];
}
// then return the address super returned
return self;
}
теперь по вашим вопросам:
Почему нам нужно выделить память для объектаAppDataObject и немедленнопосле этого - отпустить объект?
self.theAppDataObject
вызывает через установщик, который сохраняет, копирует или присваивает theAppDataObject
.в этом случае мы могли бы предположить, что он, скорее всего, будет сохранен.
Почему мы не получаем nil при доступе к этому объекту позже?
release
делаетне установить указатель на ноль.он отправляет объекту сообщение, которое затем уменьшает счетчик сохранения (в типичном случае).в этом случае вы могли бы ожидать объект, который был освобожден.это не происходит, когда аргумент сохраняется, потому что счетчик ссылок не достигает нуля в программе, которую вы показали.объект все еще жив, потому что он был сохранен, и адрес объекта сохранен, когда вызывается установщик (self.theAppDataObject = arg
).