Что такое сделка в цели C - PullRequest
7 голосов
/ 16 июля 2010

Я хочу задать общий вопрос о цели C. Когда я пишу программу приложения для iPhone, я всегда вижу функцию под названием dealloc в .m. когда будет вызван этот метод? мне нужно поместить все [релизы] сюда, полезные для приложения? большое спасибо.

// ------------------ обновленный контент -------------------------

NSArray *arr;
NSString *str;
NSMutableArray *mutableArr;

// in the dealloc
// it should have to following
[arr release];
[str release];
[mutableArr release];

функция будет вызываться 3 раза?

Ответы [ 4 ]

13 голосов
/ 16 июля 2010

Метод dealloc вызывается для объекта, когда его счетчик сохранения достиг нуля.Количество удержаний увеличивается на единицу для каждого retain вызова и уменьшается один раз для каждого release вызова.autorelease планирует будущий вызов release, когда текущий NSAutoreleasePool опустошается, обычно в конце цикла событий, но вы можете настроить свои собственные NSAutoreleasePools для операций с интенсивным использованием памяти.(Подробности смотрите в документации NSAutoreleasePool.)

Что вы должны положить в dealloc?Вы должны поставить релиз для каждого объекта-члена, который сохраняет объект этого класса.

Несколько вещей делают это проще.Объект nil будет спокойно игнорировать любые отправленные ему сообщения, поэтому [foo release], когда foo = nil не является ошибкой.Однако двойное освобождение объекта может вызвать серьезные проблемы.Мое (едва ли уникальное) решение этой проблемы состоит в том, чтобы явно установить все, что я только что выпустил, равным нулю, всякий раз, когда я выпускаю это.Фактически, я помещаю нулевое назначение в ту же строку, что и выпуск, чтобы я мог найти "выпуск" и найти места, которые я пропустил.Пример:

@interface MyClass {
    Foo *foo;
    Bar *bar;
    NSInteger baz;
}
-(void)dealloc;
@end

@implementation MyClass
-(void)dealloc {
    [foo release]; foo = nil;
    [bar release]; bar = nil;
    [super dealloc];
}
@end

Я назначу nil для переменной , даже когда эта переменная собирается выйти из области действия или объект собирается исчезнуть. Зачем?Если другой объект того же класса будет размещен в том же пространстве памяти после того, как я выпустил этот, это гарантирует , что не будет никаких висячих указателей, которые новый объект мог бы случайно использовать и сделать отладку кошмаром.(См. Также NSZombieEnabled для справки по отладке.)

5 голосов
/ 16 июля 2010

когда будет вызван этот метод?

Он вызывается, когда счетчик ссылок для этого объекта становится равным 0, поскольку все его указатели были освобождены. Занятая им память освобождается; сам объект уничтожен.

мне нужно поместить здесь все [релизы], полезные для приложения?

Да, освободить все свойства объекта, которые все еще сохраняются.

РЕДАКТИРОВАТЬ: в ответ на ваш обновленный вопрос, dealloc в вашем пользовательском объекте вызывается только один раз. Затем он отправит эти три сообщения:

[arr release];
[str release];
[mutableArr release];

Для каждого из трех объектов. Это полностью различных объектов, но если у вас есть только один экземпляр каждого из них, то все их счетчики ссылок уменьшаются до 0 и их dealloc методы вызываются автоматически.

1 голос
/ 16 июля 2010

Как вы уже догадались, он вызывается, когда объект уничтожен.Объект должен освободить все, что ему принадлежит.

0 голосов
/ 16 июля 2010

Другими словами, Dealloc освобождает / уничтожает / освобождает память, выделенную для ваших объектов.Выделенные объекты в памяти должны быть уничтожены, если они не используются, чтобы избежать утечек памяти, которые могут привести к сбою приложения.

ZaldzBugz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...