2010-11-04 4 views
1

Я столкнулся с настоящим тяжелым здесь.Ссылка не возвращает ноль, даже если освобождена

Мой класс создан самостоятельно (a + (void) start; -method), который отправляется делегату. Мне нужно отправить делегату несколько сообщений через делегат-селекторов. Чтобы проверить, был ли делегирован делегат, я пробовал if (delegate == nil/NULL), но даже если он действительно выпущен, он все еще говорит, что это не так.

Как я могу это исправить? (Делегат присваивается id)

Это как мое приложение застроена:

AppDelegate 
> NavController 
>> TableView 
>>> Post 
>>>> GetData 

GetData является самостоятельно создал класс. Сообщение является делегатом GetData и выпущено TableView/NavController. После отпускания Post также устанавливается значение nil.
Другими словами, GetData не выпускает его делегата!

ответ

3

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

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

+0

Что делать, если класс даже не освобождает делегата, другой класс превосходит его (и также устанавливает его в nil ...)? – Emil

+0

Это прекрасно, только до тех пор, пока ссылка делегата класса будет установлена ​​на ноль до того, как сам делегат будет выпущен. –

+1

В вашем случае, когда 'Post', похоже, принадлежит' GetData', просто добавьте 'delegate = nil' в метод' -dealloc'. –

5

Распределение содержания указателя не автоматически устанавливает указатель на NULL. Вам нужно сделать это явно, например.

[delegate release]; 
delegate = nil; 
+0

Это, вероятно, где моя проблема лежит. См. Обновленный вопрос (через несколько минут) – Emil

+0

@Emil: без какого-либо кода (связанных с назначением «делегата») трудно понять, какова ваша фактическая проблема. – kennytm

+0

Я исправил его, сохранив делегат, так как сам класс GetData принадлежит. – Emil

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