Прежде всего [Person new]
является сокращением для [[Person alloc] init]
, а не [Person person]
(который по соглашению должен возвращать автоматически выпущенный экземпляр).
[Foo new]; //-> retained (you're among the owners)
[[Foo alloc] init]; //-> retained (you're among the owners)
[[Foo alloc] initWithBar:@"bar"]; //-> retained (you're among the owners)
[[[Foo alloc] init] autorelease]; //-> retained, then autoreleased (you're not among the owners)
[Foo foo]; //-> autoreleased (you're not among the owners)
[Foo fooWithBar:@"bar"]; //-> autoreleased (you're not among the owners)
Это значит, что ваш код полностью делает то, что вы хотите.
- Создание локального экземпляра person1 человека с самим собой в качестве владельца.
- Добавление его в массив (создание массива вторым владельцем person1)
- Освобождение лица1 (удаление себя из владельцев лица1)
- В результате получается экземпляр Person, единственным (текущим) владельцем которого является массив.
Как только массив освобождается, он будет вызывать [person1 release], который затем будет вызывать [self dealloc], так как его счетчик удержания достигнет 0. (Если вам интересно, почему по какой-то магической причине ваш Счет персоны person1 не равен 1 после шага "4.": прочитайте это )
Эти фрагменты кода в основном функционально эквивалентны:
//Alloc, init, assign name, then release:
Person *person1 = [Person new];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];
//Alloc, init, assign name, then release:
Person *person1 = [[Person alloc] init];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];
//Alloc, init with argument name, then release:
Person *person1 = [[Person alloc] initWithName:@"Meier"];
[personArray addObject:person1];
[person1 release];
//Alloc, init with argument, assign name, then autorelease:
Person *person1 = [[[Person alloc] init] autorelease];
person1.name = @"Meier";
[personArray addObject:person1];
//Alloc, init with argument name, then autorelease:
Person *person1 = [[[Person alloc] initWithName:@"Meier"] autorelease];
[personArray addObject:person1];
//Use autoreleased convenience method:
Person *person1 = [Person person];
person1.name = @"Meier";
[personArray addObject:person1];
//Use autoreleased convenience method with argument name and add its result to array right away and anonymously:
[personArray addObject:[Person personWithName:@"Meier"]];
Все это приводит к тому, что person1 принадлежит только массиву и NSAutoreleasePool (если таковой существует, что должно быть в случае с последними 4 фрагментами) и только до тех пор, пока пул не будет очищен.