2011-12-03 29 views
4

在我的應用程序中,我做了很多網絡加載。我的數據模型由執行此操作的「Loader」對象組成,並在完成/失敗時調用其委託。代表都符合「LoaderDelegate」協議。調用委託方法,無法識別的選擇器,因爲發送到錯誤的對象

我遇到的問題是,有時看似隨機的對象,而不是委託,正在獲取委託消息。這當然會由於無法識別的選擇器而導致崩潰。

只有一組崩潰日誌告訴我哪一個裝載者有問題,其他人沒有這些信息,只是收到消息的隨機對象。

我被困在如何確定這個問題的真正原因。

一套崩潰日誌有一個加載器試圖調用它的代表,但達到_UIImageViewExtendedStorage。另一個裝載機正在達到__NSCFInputStream。另外__NSBlockVariable__。還有一個,CALayer

而這只是我3天前的最新測試版。

如果每次都是同一個對象,那將是一回事,但它看起來幾乎是隨機的。不知何故,內存是否可能被一個新的對象覆蓋?

我的所有裝入器的委託屬性都是assign屬性,但是裝入器完成時代理始終是活動的(委託是我的視圖控制器調用裝入器)。

回答

2

原來我在這個地方隨機出現這個錯誤,只是不在這個特定的類中,而不僅僅是委託方法。

在我的情況下,問題原來是我正在訪問多個線程中的各種類的屬性,而這些屬性是非原子的。由於我解決了這個問題(刪除了屬性的非原子屬性),我還沒有看到這種情況發生。

4

請張貼一些代碼,導致很難排除故障。請記住在dealloc中刪除你的委託。

- (void) dealloc { 
    objectOfWhichIAmTheDelegate.delegate = nil; 
} 

什麼是更多的你委託應該是一個指派屬性不保留 - 但這不是你的情況的問題。

@property (assign) id<TheMightyDelegate> delegate; 

你應該做的另一件事是確保代理響應你想發送給他的選擇器,然後再啓動該方法。

if ([delegate respondsToSelector:@selector(yourMethod)]) { 
[delegate performSelector:@selector(yourMethod)]; 
} 

希望這會爲您的問題提供一些信息。如果不是,請提供一些代碼。

+0

我正在使用assign,請參閱我的問題的最後一句。 ;)我目前沒有在dealloc中設置委託給nil,所以我會試試。雖然我不確定爲什麼會導致這個問題,因爲只有在nsurlconnection完成後纔會釋放加載器,並且他們會調用它們的代理。另外,我知道將所有委託調用包裝在'respondsToSelector'中將會停止崩潰,但我想找出問題的根本原因。代理財產爲什麼一直指向錯誤的地方對我來說沒有意義。 –

+0

這是太多的代碼來發布一切,但爲了給你一個結構的想法,我所有的裝載機都是從一個Loader超類來分類的。所有加載器的委託屬性實際上都在超類中。不知怎的,這可能是問題的一部分嗎? –

+0

_is_委託的對象需要'_null' _other_對象的'委託'出口;第一個代碼片段錯誤地指出一個對象應該''不要'擁有''委託'出口。 @ einsteinx2 –

相關問題