@autorelease и циклы

Предположим, у меня есть такой код:

@autoreleasepool {
  for(int i = 0; i < relatedSlideDecks.count; i++) {
    MyClass *myObject = [MyClass new];
    ... something happens here
    [myObject release];
  {
}

мне все еще нужен этот [myObject release];? Или он будет выпущен автоматически из-за @autoreleasepool?


person Zepplock    schedule 03.01.2012    source источник


Ответы (3)


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

person dreamlax    schedule 03.01.2012

Если вы используете ARC, в этом нет необходимости.

В противном случае вам нужно вызвать этот метод выпуска.

Единственное, что гарантирует, что блок @autoreleasepool состоит в том, что после того, как ваш код выполнит его, любой объект с вызовом autorelease получит вызов освобождения.

person Ignacio Inglese    schedule 03.01.2012

Да, вам все еще нужен этот [myObject release]. Наличие @autoreleasepool не приводит к волшебному автоматическому освобождению объектов. Он просто приводит к очистке объектов, которые автоматически освобождаются, когда пул автоосвобождения иссякает. Дополнительную информацию можно найти в Руководстве по программированию для расширенного управления памятью.

person Lily Ballard    schedule 03.01.2012