Управление памятью выходов Interface Builder

Я использую @property(nonatomic, retain) для своего приложения IBOutlets для iPhone. Однако я не уверен, как убедиться, что я правильно управляю памятью с ними. Все IBOutlets настраиваются в Interface Builder, поэтому я никогда не вызываю alloc вручную. Это означает, что я не уверен, когда и нужно ли освобождать их или когда устанавливать их так, чтобы они указывали на nil.

Каковы наилучшие методы обеспечения отсутствия утечки памяти после выгрузки представления?


person Jordan Kay    schedule 30.11.2009    source источник


Ответы (3)


Если вы используете @properties для своих IBOutlets и устанавливаете соединения в IB, то ваш контроллер, по сути, сохраняет объекты IB со свойством и, следовательно, несет ответственность за их освобождение, когда с ними покончено.

Когда ты с ними закончил?

В любом случае вы должны устанавливать свои свойства self.propertyname = nil в методе viewDidUnload и снова в dealloc каждого viewController.

Это довольно просто, IB управляет всем остальным.

person Jessedc    schedule 30.11.2009
comment
Я уверен, что это неправильно. Если вы аннулируете свои торговые точки в -viewDidUnload, у вас возникнут проблемы, когда вам нужно будет снова загрузить свое представление. Это происходит, когда вы выгружаетесь во время предупреждения о нехватке памяти, и его нужно показать снова. - person Johan Kool; 01.12.2009
comment
Йохан: вы ошибаетесь. Как правило, вы должны установить для выходов значение nil в -viewDidUnload именно для того, чтобы предупреждения о памяти работали. Если вы этого не сделаете, контроллер представления сохранит выходы (которые часто являются подпредставлениями выгружаемого представления и не могут быть освобождены). Если представление нужно отобразить снова, контроллер представления перезагрузит NIB и повторно подключит выходы. Конечно, вы не должны освобождать выходы, которые вам нужны, чтобы оставаться в живых, даже когда представление выгружается (т. Е. Контроллер представления находится вне экрана). - person Ole Begemann; 01.12.2009

По умолчанию семантика @property равна retain, что означает, что когда контроллер представления загружает перо и подключает IBOutlets, они сохраняются установщиком @synthesized. Следуйте стандартным правилам управления памятью Cocoa: в конечном итоге вы должны release использовать эти свойства, иначе произойдет утечка памяти. dealloc, вероятно, хорошее место для этого. На айфоне это можно сделать через self.outletProperty = nil. В OS X (когда вы не используете GC) правила такие же, за исключением того, что вы можете использовать [self->outletProperty release] явно, минуя сеттер @synthesized.

person Barry Wark    schedule 01.12.2009

Вы должны сделать это так ....

[yourOutletVar release];
yourOutletVar = nil;

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

person Madhup Singh Yadav    schedule 01.12.2009