Можно ли писать код после [super dealloc]? - PullRequest
2 голосов
/ 04 января 2011

В моем коде есть ситуация, когда я не могу очистить объекты классов без предварительного вызова [super dealloc].Это что-то вроде этого:

// Baseclass.m
@implmentation Baseclass

...

-(void) dealloc
{
    [self _removeAllData];
    [aVariableThatBelongsToMe release];
    [anotherVariableThatBelongsToMe release];
    [super dealloc];
}

...

@end

Это прекрасно работает.Моя проблема в том, что когда я перешел в подкласс этого огромного и неприятного класса (более 2000 строк общего кода), я столкнулся с проблемой: когда я выпускал свои объекты перед вызовом [super dealloc], у меня были зомби, бегущие по коду, который был активирован, когдаЯ вызвал метод [self _removeAllData].

// Subclass.m
@implementation Subclass

...

-(void) dealloc
{
    [super dealloc];

    [someObjectUsedInTheRemoveAllDataMethod release];
}     

...

@end

Это прекрасно работает, и это не потребовало от меня рефакторинга какого-либо кода.Мой вопрос: это безопасно для меня, или я должен рефакторинг своего кода?Или, может быть, авто-релиз объектов?

Я программирую на iPhone, если это имеет значение.

1 Ответ

2 голосов
/ 04 января 2011

Хорошо, я говорил мусор. [super dealloc] нужно называть последним.

Конечно, это не отвечает на ваш вопрос.

Не глядя на ваш код, трудно увидеть, но проблема, похоже, в том, что метод _removeAllData

Во-первых, вы не должны ставить префикс методов перед подчеркиванием, поскольку этот префикс зарезервирован Apple ( Reference ) для приватных методов.

Во-вторых, он, очевидно, используется для приведения в порядок объекта и может освобождать объекты, которые вы потом отпускаете вручную. Это может быть даже освобождение объектов, определенных в одном из суперклассов, которые затем чрезмерно освобождаются в [super dealloc].

Итак, после небольшого размышления (больше, чем следовало бы, действительно) проблема не в том, как называется ваш деллок вашего супер; но в том, что и когда очищается.

Извините за мою предыдущую ошибку, и благодаря комментаторам, которые убедили меня в моей ошибке, а не позволили мне упорствовать в моей ошибке.

Оригинальный ответ

Да. Пока вы не пытаетесь использовать какие-либо переменные суперкласса.

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