Как проверить, действителен ли делегат? - PullRequest
1 голос
/ 30 декабря 2008

Я делаю что-то вроде этого:

@protocol CallbackDelegate
-(void) performCallback;
@end

@interface MyObject : NSObject {
   id<CallbackDelegate> delegate;
}

-(void)AsyncFuncCall;

@end

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

Код, которому принадлежит MyObject, устанавливает делегата для получения функции обратного вызова:

MyObject *myobject = [[MyOject alloc] init];
myobject.delegate = x;

Затем в MyObject, в результате асинхронного вызова функции, я сообщу делегату:

-(void)AsyncFuncCall {
   [delegate performCallback];
}

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

Кто-нибудь знает лучший способ проверить, действителен ли делегат?

Я пробовал все виды вещей, таких как:

if (delegate != nil) {
   ...
}

без удачи.

1 Ответ

4 голосов
/ 30 декабря 2008

Ваш делегат должен исключить свойство делегата myObject в его dealloc, чтобы избежать этого:

- (void) dealloc {
  if (myObject.delegate == self) myObject.delegate = nil;
  [super dealloc];
}

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

...