2013-05-03 80 views
3

我有一個類將委託消息發送到另一個類。 如果其他班級未在收聽,則應用程序崩潰。 我正在尋找一種方法來檢查在發送消息之前是否有其他課程正在偵聽。檢查是否有代表傾聽?

所以在發佈委託類的,我有這個條件的檢查:

 if ([self.delegate respondsToSelector:@selector(NewDataFromSocketWithString:WithCommand:)]) 
      [self.delegate NewDataFromSocketWithString:final WithCommand:c]; 

如果不知何故,該條件始終爲真,即使得到委託類是已經發布,而不是存在了。

如何在發佈前檢查委託以消除崩潰?

+0

您的問題似乎是您正在使用虛假委託指針,而不是委託沒有「響應」。您需要確保委託對象被保留,或者確保指針在對象被銷燬時將被設置爲nill。 – 2013-05-03 15:46:16

回答

5

即使獲取委託的類已經釋放並且不再存在。

......你有沒有測試過這種情況?如果你不是弱引用你的委託,那麼這不會發生。如果代表實際上已被釋放,則self.delegate應返回nil,這意味着您的if語句將評估爲false。

您的if語句評估爲true的事實表明您的代表仍然設置。您是使用ARC還是手動管理內存?如果是後者,您需要將您的財產設置爲assign - 如果是前者,則需要將代理人設置爲weak

+0

我不使用ARC,我唯一想做的事情就是聽取消息:socketInstance.delegate = self;在相關課上。後來,這個班被取代(它的一個主要觀點)。還有什麼我應該做的代表本身釋放它? – Curnelious 2013-05-03 15:53:01

+2

@Rant您應該使用ARC。但是,如果不是,那麼當委託對象被釋放時,您需要手動將委託設置爲'nil'。根據ARC的「弱」修復。如果您將'delegate'設爲'retain'屬性,那麼您可能會有一個保留週期。 – bbum 2013-05-03 16:19:41

+0

2013年使用ARC是個不錯的主意,我猜爲什麼不使用它? – 2013-05-03 19:28:34