delegateの呼び出しとメモリー管理(合ってるかどうかは知らない)
delegate オブジェクトは大概の場合は保持(retain)しません。retainすると循環参照が起きてメモリーリーク起こしやすくなりますので。
じゃあ、delegate先がreleaseされてる場合はというと、メッセージを呼び出せずに逝ってまいはいます。performToSelector: を投げて調べるってのもありますけどめんどうです。
releaseされたオブジェクトは、_NSZombie_... というクラスに変化されますので、メッセージを投げる直前にそのオブジェクトが変化してないか見てから投げるようにしてやればいいのかしらと思いこんなコード。
@implementation test @synthesize _delegate = delegate; - (id) delegate { @synchronized(_delegate) { NSString* cls = NSStringFromClass(_delegate->isa); if ([cls compare:@"_NSZombie"] == 1) { _delegate = nil; return nil; } return _delegate; } } @end
参考:
delegate オブジェクトは retain すべきではない - 24/7 twenty-four seven