@autorelease и петли - PullRequest
       50

@autorelease и петли

1 голос
/ 04 января 2012

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

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

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

Ответы [ 3 ]

3 голосов
/ 04 января 2012

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

3 голосов
/ 04 января 2012

Если вы используете ARC, это вообще не нужно.

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

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

2 голосов
/ 04 января 2012

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

...