→ darktt: 在B銷毀的時候將Delegate設定成nil即可 12/04 00:09
感謝提醒,我有在B的dealloc設定A的delegate 為 nil
推 kiii210: 咦,delegate的property設成weak不是可以避免這種問題嗎? 12/04 00:22
→ uranusjr: Yeah, weak property 應該會自動在目標消失時 nil-out 12/04 00:31
→ uranusjr: 如果有問題請附上簡單範例 12/04 00:33
剛剛試了一下weak property,還是有同樣的問題QQ
下班之後我再附上完整範例
→ darktt: 主要是A在另外一個thread,它的delegate沒有與main thread 12/04 09:02
→ darktt: 同步所造成的 12/04 09:02
A其實是隸屬於B的一個子元件,並且A會在thread開始與結束時retain/release delegate
然後B會在viewDdidDisappear的時候把A停掉
所以應該是不會有B比A早死的狀況,也不會有同步的問題吧..?我猜
推 howdiun: respondsToSelector有加嗎 12/04 09:10
是的,A的程式碼大概長這樣:
// A的Thread method
- (void)threadA {
[delegate_ retain];
while(![NSThread currentThread].isCancelled) {
if (delegate_ && [delegate_ respondsToSelector:@selector(callback)] {
NSMethodSignature *signature =
[(NSObject *)delegate_ methodSignatureForSelector:@selector(callback)];
NSInvocation *invoke =
[NSInvocation invocationWithMethodSignature:signature];
[invoke setTarget:delegate_];
[invoke setSelector:@selector(callback)];
[invoke setArgument:&self atIndext:2];
...
[invoke performSelectorOnMainThread:@selector(invoke)
withObject:nil
waitUintilDone:NO];
}
}
[delegate_ release];
}
// B的dealloc
- (void)dealloc {
[A setDelegate:nil];
[A release];
A = nil;
...
[super dealloc];
}
※ 編輯: Esvent (220.135.62.74), 12/04/2014 10:33:35
→ uranusjr: Delegate 會 release owner 怎麼看都怪... 12/04 10:38
→ uranusjr: 這應該只是名詞的問題而已就是了, 其實它們兩個不是真的 12/04 10:38
→ uranusjr: delegate 關係, 比較像 target-action 12/04 10:39
→ Esvent: 找到一個方法..在B的dealloc讓mainRunLoop多跑個幾秒就ok 12/10 19:00
→ Esvent: 不過因為沒有檢查到底有沒有跑完..所以還是有很低的機率會 12/10 19:01
→ Esvent: 當掉 12/10 19:01