Как узнать, выпущен ли делегат ios

Я широко использую делегирование для структуры ВИД - УПРАВЛЕНИЕ - МОДЕЛЬ. Обычно объекты CONTROL & MODEL сохраняются во время работы приложения, вызывая небольшие проблемы.

Однако объекты VIEW, которые часто являются экземплярами UIViewController, выделяются и освобождаются множество раз.

Установка nil для объекта-делегата, которому назначен динамический экземпляр UIViewController, когда он освобождается, — это один из известных мне способов избежать ошибки EXC_BAD_ACCESS.

Однако, даже если я всегда использую:

if ([delegate respondsToSelector:@selector(communityModel:finishedDeletingComment:)]) {
    [delegate communityModel:self finishedDeletingComment:succeeded];
}

это не идеально для предотвращения ошибок. Если разные объекты VIEW совместно используют одного или ограниченное количество делегатов объекта CONTROL, это всегда может привести к непреднамеренной замене делегатов другими, что приведет к EXC_BAD_ACCESS.

Есть ли лучший способ управлять делегатами, чтобы узнать, действительно ли он доступен в момент вызова методов делегата?

Я сомневаюсь, что мой обычный способ установки свойств для делегата должен быть изменен. Я использую этот способ для установки свойств делегата:

@property (nonatomic, assign) id<ControlDelegate> delegate;

Я иду по правильному пути, сомневаясь в настройке собственности?


person petershine    schedule 06.05.2011    source источник


Ответы (1)


Я объявляю делегаты как свойства assign, когда мой объект (который будет использовать делегат) является членом делегата или членом члена делегата и т. д. В этом случае свойство retain приведет к утечке памяти. В другом месте я не вижу причин не удерживать делегата. Если это приемлемо для вас - попробуйте объявить свою собственность как:

@property (nonatomic, retain) id<ControlDelegate> delegate;
person 5hrp    schedule 06.05.2011