Подтвердить что ты не робот

Что происходит, когда выполняется следующий код? Ball * ball = [[[[Ball]] init] autorelease] autorelease];

Что происходит, когда выполняется следующий код?

Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
4b9b3361

Ответ 1

Позвольте сломать его:

[Ball alloc]: Это создает объект Ball, который у нас есть (и, следовательно, его нужно отменить).

[[Ball alloc] init]: Это инициализирует объект Ball, который мы только что создали.

[[[Ball alloc] init] autorelease]: это добавляет Ball в текущий пул автозапуска, поэтому он будет выпущен, когда этот пул будет удален. Это правильно, если, например, мы собирались вернуть Ball из метода.

[[[[Ball alloc] init] autorelease] autorelease]: Это снова очищает объект Ball. Это 100% неправильно. alloc - это единственное требование собственности, которое нам нужно сбалансировать, поэтому Ball теперь будет выпущен слишком много раз. Это может проявляться любым количеством способов, но, скорее всего, это просто сбой.

Ответ 2

Краткий ответ: Наступает авария.

Ответ 3

После того, как вы отправили вызов объекта autorelease, теперь вы передали его ответственность за освобождение autorelease pool, теперь это похоже на то, что вы не владеете им. Это покажет случайное поведение, которое может вызвать сбой, а иногда и нет. Зависит от того, когда пул автораспределения освободит его, если его выпуск затем сработает)