4

Недавно, когда я изучил управление памятью iPhone, я попытался сравнить метод удобства и метод init на том же объекте. Например, у меня есть UIImageView, где он отображает загруженный NSData: методИспользование памяти по методу удобства по сравнению с методом init

Convenience: метод

imageView.image = [UIImage imageWithData:[downloads dataAtIndex:0]]; 

INIT:

UIImage *aImage = [[UIImage alloc] initWithData:[downloads dataAtIndex:0]]; 
imageView.image = aImage; 
[aImage release]; 

Когда я пытаюсь идти вперед и назад на взглядах, чтобы увеличить использование памяти и нажатие «Имитировать предупреждение памяти», использование памяти для приложения с 20 МБ до 18 МБ с помощью удобного метода, а метод init - с 20 МБ до 13 МБ.

Я также ждал и взаимодействовал с приложением, чтобы дать время на освобождение по авторекламе удобства. Но это не сильно упало.

Помимо автореферата по сравнению с релизом, что еще способствовало разнице?

ответ

1

Единственная разница, которая может быть причиной этого, заключается в том, что imageWithData: не использует кеш системного образа, а initWithData: делает. Таким образом, возможно, изображение, созданное с помощью инициализатора, может выпустить его данные изображения, когда оно получает предупреждение о памяти, поскольку оно может вернуться в системный кеш, а тот, который создан методом удобства, не может.

1

Объекты, созданные с помощью удобных методов, автореализованы, так как я уверен, что вы знаете. Однако, если у вас нет AutoReleasePool в RunLoop, где вы создаете изображение, тогда объект будет добавлен в несуществующий пул и никогда не будет правильно очищен. Это может быть так, если вы работаете в потоке и забыли создать AutoReleasePool для этого потока.

Чтобы проверить, действительно ли это, вы можете запустить Инструменты (Утечки) и посмотреть, что он сообщает.

+1

Если нет пула авторезистов, вы должны получить предупреждения, напечатанные на консоли при попытке создать автореализованный объект, fyi. – 2008-11-14 13:57:59

+0

Это должно быть на главной теме, так что это может быть не связано ... – leonho 2008-11-14 15:44:30

4

Ваши автореализованные объекты, созданные с помощью удобных методов, не будут выпущены до тех пор, пока не будет сброшен пул авторезистов. Целесообразно проводить операции с интенсивной памятью внутри блока NSAutoreleasePool, если вы будете активно использовать их.

1

Что-то, что я заметил, заключается в том, что с автореализованными объектами, находящимися под давлением памяти, существует система GC, которая встречается с заметным поражением производительности, если вы не выпускаете свои пулы своевременно.

Кроме того, использование метода init/release позволяет сократить потребление памяти в циклах, в то время как использование пула авторезистов создает всплески. В некоторых проблемах с памятью, быстрое увеличение объектов в пуле авторасчетов может привести к загрузке вашего приложения, прежде чем система предпримет шаги по очистке таких вещей, как открытые электронные письма, вкладки сафари для мобильных устройств и работа iTunes.

Нижняя линия. Я использую init больше, потому что это делает потребление памяти приложения более последовательным, и я вижу меньше проблем с загрузкой случайно. Постепенное увеличение потребления памяти позволяет демонам очистить систему, не убивая мое приложение. Наконец, как и в некоторой степени в сторону, если вы используете @property ключевое слово в ваших классах, вы должны быть осторожны с вещами, как:

myProperty = [NSMutableArray arrayWithCapacity:10]; 

Потому что будет происходить, когда бассейн в вашем классе main.m получает собранный элемент, который исчезнет, ​​что приведет к сбою из-за вызова метода на выпущенном объекте.Если вы устанавливаете его @property (неатомической, сохранить) вы хотите использовать:

self.myProperty = [NSMutableArray arrayWithCapacity:10]; 

, чтобы убедиться, что он висит вокруг. Однако вы можете избежать всего этого, просто перейдя с помощью функции alloc init. Просто следите за количеством ссылок, чтобы убедиться, что у вас нет двойных ссылок, вызывающих утечки памяти.

Смежные вопросы