ARL подсчитывает ссылки и освобождает - PullRequest
2 голосов
/ 29 марта 2012

Я немного запутался.Я создаю приложение с раскадровкой и запускаю его на iPad 1. Приложение использует много памяти, поэтому достигает 120 Мб, вылетает.в соответствии с тем, что я понял, чтобы устранить эту проблему, вам нужно решить, dealloc ... дело в том, что с ARC это должно быть автоматическиНа самом деле, если я добавлю, например: [label1 release];это дает мне ошибку.Но этот автоматический релиз ARC и dealloc, похоже, не работает!Это потому что есть разные способы релиза с ARC ??

enter image description here

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

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

С ARC вам все еще нужно думать об использовании памяти, вам просто не нужно беспокоиться об утечках памяти.

NSObject *bigMemObj = [[BigMemClass alloc] init];
//This creates the object in memory. In both arc and manual counting the retain count is 1

//Do stuff

//Prior to ARC you would have had to call [bigMemObj release]; before setting the variable to nil
bigMemObj = nil
//With ARC you don't have to do anything. The compiler inserts the release at compile time

Также ознакомьтесь с документацией по объявлению iVars __strong vs __weak.

Не глядя на ваш код, трудно определить, что занимает всю память, но, надеюсь, это поможет вам определить, с чего начать поиск.

0 голосов
/ 29 марта 2012

Я не могу проголосовать за это, иначе я бы так и сделал. Я думаю, что Алессандро спрашивает об ARC против использования release и dealloc, а не о том, что он загружает!

Итак, Алессандро, ваше понимание верно, что с ARC вы не освобождаете или не освобождаете. Поэтому они не будут работать, если вы используете ARC. Также нет альтернативы release / dealloc, так как ARC не использует ее.

Я бы посоветовал посмотреть, что вы используете в приложении, которое занимает всю эту память. Например, есть ли у вас большое количество очень больших картинок? Сохраняйте любую графику как можно меньше в соответствии с разрешением iPad. Особенно iPad 1, у которого нет «дисплея сетчатки глаза».

Вы можете использовать пуски автоматического выпуска в ARC. Вот некоторая документация о том, когда их использовать: NSAutoreleasePool Class Reference Расширенное руководство по программированию управления памятью: Об управлении памятью

0 голосов
/ 29 марта 2012

Вы должны реализовать @autoreleasePool{} внутри каждого метода.По сути, каждый метод будет выглядеть следующим образом:

-(void)methodName{
@autoreleasePool{
//do method stuff
}
}

Это обеспечит правильное освобождение памяти после выхода из autoreleasePool.

...