2010-09-28 78 views
2

我在我的應用程序中收到了「objc_msgSend()」殺手級錯誤消息,並感謝Hamster Emporium 我可以弄清楚發生了什麼。objc_msgSend()錯誤消息,爲什麼?

現在我發現了「問題」和「解決方案」,但是我不明白爲什麼我的問題確實是一個問題。

下面是這種情況:

Object_A - > Object_B - > Object_C

的 ' - >' 符號表示 「創造」 的行動。 類Object_C的是這樣的:

@interface Class_C { 
    NSArray *items; 
} 
@property (nonatomic, retain) NSArray *tems; 
@end 

屬性「項目」通過「setItems」的方法設置Object_B:現在

- (void)setItems:(NSArray *)items_ { 
if (object_B) { 
    [object_B.taskItems release]; 
    object_B.taskItems = items_; 
} 
[super setItems:items_]; 
} 

,如果我用這個方法,是我得到了褻瀆'objc_msgSend()'錯誤,但如果我評論釋放線一切順利。

注:在釋放行retainCount爲0,但釋放執行沒有問題

回答

2

你得到的是錯誤,因爲taskItems成員變量被釋放兩次。沒有必要手動發佈taskItems,因爲使用點語法自動處理它。

這條線:

object_B.taskItems = items; 

調用用於taskItems屬性訪問,其中,所述新的一個被保持之前的舊值會自動釋放(或複製,這取決於屬性的定義)。

Cocoa內存管理的一個非常好的通用規則是,如果你創建了一個對象(通過alloc/init或者copy),那麼你應該只有release。釋放object_B.taskItems將違反該規則。

1

嚴,哇。好。

object_B.taskItems = items_; 

是與調用

[object_B setTastItems: items_]; 

如果taskItems是設置保留,你不必先將它因爲屬性會這麼做的屬性。你現在擁有你的代碼的方式,它會被釋放兩次。

請記住,屬性與Objective-C中的成員不同。屬性是訪問班級的私人成員的方法(並且做類似retain/release@synchronized的花式東西)。

0

我也有類似的問題,但對我來說這是情景:

我做了一個控制器,將自己註冊爲監聽在「isFinished」一個的NSOperation屬性的變化,而的NSOperation正在我的控制器去離開,這時的NSOperation完成,並試圖通知:

[self willChangeValueForKey:@"isFinished"]; 

objc_msgSend() corrupt cache error 

但它是因爲我的控制器是出上海合作組織PE,解決它我等待NSOperation KVO的結果,然後移動到下一個控制器。