Маленький вопрос о владении объектом - PullRequest
1 голос
/ 05 апреля 2011

У меня есть маленький кусочек кода:

Person *person1 = [[Person alloc] init];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];

Когда я создаю объект, добавляю его в массив и отправляю release person1 толькосохраняется в массиве.Массив становится владельцем и отвечает за person1 .Но когда я создаю person1 с new , он добавляется в пул автоматического выпуска, и я не должен отправлять release в него.

Как сделать массив ответственным за человека?Только массив?!

РЕДАКТИРОВАТЬ

Думаю, я был очень смущен этим вечером.

ДА, объекты, созданные с помощью new , не добавляются вautoreleasepool автоматически.

ДА, я знаю, что мне все еще нужно освобождать объекты, созданные с помощью new .

Я на мгновение забыл все это.Большое спасибо за ответы!

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Прежде всего [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)

Это значит, что ваш код полностью делает то, что вы хотите.

  1. Создание локального экземпляра person1 человека с самим собой в качестве владельца.
  2. Добавление его в массив (создание массива вторым владельцем person1)
  3. Освобождение лица1 (удаление себя из владельцев лица1)
  4. В результате получается экземпляр 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 фрагментами) и только до тех пор, пока пул не будет очищен.

2 голосов
/ 05 апреля 2011

Но когда я создаю человека с новым добавляется в пул авто-релиза и я не должен отправлять релиз.

Согласно правилам , вышеприведенное неверно. Если вы используете new для создания персонажа, вы все равно отвечаете за освобождение полученного объекта.

Тем не менее, давайте предположим ради аргумента, что каким-то образом вы создаете экземпляр Person, который автоматически выпускается. В этом случае вы просто не отпускаете объект. Если вы добавите его в массив, массив сохранит объект как обычно и будет нести ответственность за его освобождение после завершения работы с этим объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...