Вопрос по управлению памятью

#iphone #objective-c #xcode

#iPhone #objective-c #xcode

Вопрос:

Каков наилучший подход к выпуску нескольких экземпляров объекта, который вы не можете выпустить сразу?

Например, если вы создаете кучу эскизов:

    for(int i=0; i <totalThumbs; i  ){        

     Thumb *newThumb = [[Thumb alloc] initWithImage:someImage]

     //position the thumbs here, etc.

     //assume releasing here breaks the app because we need to interact with the thumbs   later
     // [newThumb release] --- breaks the app         

    }
  

Имело бы смысл поместить все новые объекты в массив и выпустить их все в viewDidUnload, когда они нам больше не понадобятся?

Комментарии:

1. Thumb *newThumb = [[[Выделение большого пальца] initWithImage:someImage] автореализация];

2. Ваш код без закомментированного выпуска должен был быть правильным. Проблема с поломкой вашего приложения, вероятно, заключается в той части, которую вы пропустили.

3. Чтобы точно сказать вам, что не так, нам нужно увидеть любой код в этом цикле for, который не просто устанавливает свойства newThumb , то есть добавляет его в массив, добавляя его в супервизор.

Ответ №1:

Предположительно, вы добавляете каждое из них newThumb в качестве подвида какого-либо другого представления или в массив, так что у вас все должно быть в порядке, чтобы сделать это, а затем выпустить newThumb здесь. Например:

 Thumb *newThumb = [[Thumb alloc] initWithImage:someImage];
[myThumbs addObject:newThumb];
[newThumb release];
  

Это работает, потому что myThumbs сохраняет объект.

Чтобы избежать утечки памяти, особенно если вы повторно создаете эскизы, вы хотели бы выполнить итерацию по подвидам супервизора (все большие пальцы), удалить каждый из супервизора и освободить их. Вам также может потребоваться сделать это в вашем методе dealloc, где вы выпускаете superview (при условии, что вы это сделаете). Я полагаю, что с помощью массива вы могли бы просто вызвать removeAllObjects .

Ответ №2:

Возможно, я чего-то не понимаю, но почему бы не использовать autoreleasepools?

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

for(int i=0; i <totalThumbs; i  ){        
  Thumb *newThumb = [[[Thumb alloc] initWithImage:someImage]autorelease];
}

[pool drain];
  

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

Ответ №3:

Вы можете освободить их сразу после добавления в массив, потому что массив их сохраняет:

 for(int i=0; i <totalThumbs; i  ){        
    Thumb *newThumb = [[Thumb alloc] initWithImage:someImage]

    //position the thumbs here, etc.

    [thumbsArray addObject:newThumb];

    [newThumb release]; // --- doesn't break the app         

}
  

Вставьте viewDidUnload и / или dealloc освободите массив. Вам не нужно отпускать каждый большой палец.

Ответ №4:

Мы всегда должны избегать выделения памяти в цикле. В вашем случае вы должны освободить память сразу после использования созданного вами объекта. то есть

 for(int i=0; i <totalThumbs; i  ){          

   Thumb *newThumb = [[Thumb alloc] initWithImage:someImage];  

   //position the thumbs here, etc.  

   //assume releasing here breaks the app because we need to interact with the thumbs later  
   // [newThumb release] --- breaks the app  
   // Work with newThumb  
   [newThumb release];
}  
  

Делая это, объекты освобождаются при каждом запуске цикла времени. На самом деле каждый раз, когда выполняется цикл, создается новый объект. Вот как вы можете управлять распределением памяти в цикле.

Приветствия!

Комментарии:

1. Могу ли я узнать, в чем проблема с моим решением, кто бы это ни был.

2. OP заявил, что он не может сразу освободить объекты. Ваш ответ предполагает именно это.

3. Да, я тоже это видел. Но вам нужно освободить память после использования. Вы можете сохранить их в массиве, а затем выполнить освобождение. Если цикл выполняется пару раз. В этом случае у вас может возникнуть проблема с памятью.

4. (Я не сторонник отказа) У меня есть некоторое сочувствие, и то, что вы предлагаете, правильно, но это именно то, что на самом деле сделал OP (посмотрите на комментарии, которые вы вставили в свой ответ). Однако, очевидно, что его проблема кроется где-то в //position the thumbs here, etc. комментарии.