2013-06-06 70 views
8

參考:IOS - performSelector:withObject:afterDelay:不工作

https://stackoverflow.com/a/14741253/1749293

像上面的鏈接說,但它似乎並沒有解釋原因。

在我的代碼,下面的工作:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSelector: @selector(helloWorld) withObject:nil afterDelay:0.5]; 
}); 

但是,當我的評論是這樣的,(我真的相信,我在主線程中運行它!)代碼不工作:

// dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSelector: @selector(helloWorld) withObject:nil afterDelay: 0.5]; 
// }); 

有人可以告訴我爲什麼嗎? AND'自我',將nerver釋放/釋放,我保留它,直到應用程序結束。

「不工作」,這意味着,(無碰撞),它不會跳進「HelloWorld」的方法:

-(void) helloWorld { 
    NSLog(@"hello world");  // I set a break point here for debug , it wouldn't pause forever 
} 

我認爲是運行循環導致此問題。像this link說的,但我需要更多的細節或更明確的解釋。

+1

如果確實在主線程中,那很奇怪。爲什麼你不使用'dispatch_after()'的任何特定原因? – 2013-06-06 07:41:13

+0

什麼是BROKER.actors.event? – manujmv

+0

在第一個代碼中,您在使用'BROKER.actors.event'的時候使用'self'。那麼你確定他們指的是同一件事嗎? – sunkehappy

回答

21

當我發生這種事情時,我從GCD調用中調用performSelector。所以它在GCD工作線程中設置定時器,定時器在定時器啓動之前就消失了。當GCD刪除工作線程時,定時器丟失了,所以選擇器從未被調用過。

+2

OP:「確定我在主線程中運行它」。 – Mar0ux

+1

+1有很好的解釋 – onmyway133

1

編輯 正如在評論中指出,performSelector:withObject:afterDelay:還保留你的對象,所以忽略我的答案。 END編輯

我asume你使用ARC。你的街區正在保留你的對象。

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSelector: @selector(helloWorld) withObject:nil afterDelay:aTimeUnit]; 
}); 

這就是選擇器被觸發的原因。當你評論該塊時,沒有人保留對你的對象的引用,所以它會自動釋放。

// dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSelector: @selector(helloWorld) withObject:nil afterDelay: aTimeUnit]; 
// }); 

通過aTimeUnit經過的時間,自可能已被釋放,所以選擇呼叫丟失。那是你的問題。

您應該避免在塊內捕獲自己,因爲如果將塊存儲在ivar中,最終可能會導致保留週期,導致對象不被釋放。這裏他們談論的是: How do I avoid capturing self in blocks when implementing an API?

+0

對釋放對象的選擇器調用通常在崩潰中結束,對吧? –

+7

我很確定performSelector也保留了一切。 –

+0

我認爲,作爲w.sellers,performSelector成爲感興趣的對象的所有者,保留它直到它執行選擇器,所以沒有必要擔心在此期間自我被釋放。 – meronix

相關問題