В методе dealloc установить любой делегат на ноль необходимо или не нужно - PullRequest
1 голос
/ 03 октября 2011

Я создал табличное представление в моем представлении программно как ниже

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, 320, 370) style:UITableViewCellStyleDefault];
table.delegate = self;
table.dataSource = self;
table.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:table]; 

в методе dealloc я пишу как показано ниже

table.delegate = nil;
 table.dataSource = nil;
[table release];
table=nil;

это лучше или меньше, чем лучше

[table release];
table=nil;

Я хочу знать, не сброшу ли я делегат и источник данных, что произойдет

Thanq

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Если вы освобождаете объект, который действует как делегат от других объектов, вам необходимо убедиться, что вы установили для их делегатов значение nil, прежде чем вызывать [super dealloc] (при условии, что обычный объект не сохраняет своих делегатов). ). Это связано с тем, что после возврата [super dealloc] этот объект больше не является допустимым объектом, а объекты, делегатом которых он является, фактически имеют висячие ссылки, если для них не установлено значение nil.

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

1 голос
/ 03 октября 2011

С Установка делегата на nil в dealloc :

Это защитный ход программирования.Он очищает ссылку на объект делегата, если что-то еще в вашем объекте пытается получить доступ к делегату после того, как вы сказали, что с ним покончено.Как часть вашего решения, у вас может быть метод или что-то, что вызывает уведомление KVO, которое вызывает делегата.Так что установка ссылки делегата на ноль предотвращает это.Если это случится, вы можете столкнуться с некоторыми странными сбоями, которые интересно воспроизвести и исправить.

0 голосов
/ 21 января 2014

Чтобы добавить к ответам выше, вам не нужно

table = nil;

в вашей раздаче.Это не повредит, но не нужно обнулять свои ивары.Ваш взгляд отменяется, и поэтому ваши ивары больше не будут доступны.Вы, вероятно, путаете это с:

self.table = nil;

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

И чтобы ответить на ваш реальный вопрос, если вы не обнуляете делегата и источника данных таблицы на делок представления ... ничего не произойдет.Они настроены на представление, которое находится в процессе освобождения.В этом случае у вас не возникнет никаких проблем, не занимаясь этим.В теории это хорошая форма.

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