2011-01-04 2 views
2

У меня есть ситуация в моем коде, где я не могу очистить объекты классов без первого вызова [super dealloc]. Это примерно так:Можно ли написать код после [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, если это имеет значение.

+2

Ответил здесь http://stackoverflow.com/questions/909856/why-do-i-have-to-call-super-dealloc-last-and-not-first – Mantar

+0

Вы не зовем 'dealloc 'ты сам? Это то, что вы должны ** никогда не делать. – Rits

+0

нет ... дело в том, что на ссылку 'someObjectUsedInTheRemoveAllDataMethod' ссылается (очень длинным обходным путем, как я уже сказал, проект на самом деле груб на данный момент) привыкает после того, как я освободил его. У меня есть много круглых ссылок, и они вступают в игру ... Моя единственная цель на этом этапе - сделать рабочий код без утечек памяти. –

ответ

2

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

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

Не смотря на свой код, это трудно понять, но проблема, кажется, исходит от метода _removeAllData

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

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

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

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

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

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

+0

Хорошо, спасибо. Я просто хотел проверить, прежде чем я пошел и сделал что-то глупое. –

+2

Собственно, реальный ответ - нет. В конце концов, вызывается метод dealloc NSObject и освобождает память * целиком * объекта, а не только супер объект. Если у вас несколько потоков, вы не можете гарантировать, что любая из ваших переменных экземпляра все еще указывает на действительные объекты, поскольку другой поток может повторно использовать память. – JeremyP

+0

Джереми - в этом конкретном случае он все еще находится в 'dealloc', он просто не называет' [super dealloc] последним. – Abizern

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