[英]I don't know why I get EXC_BAD_ACCESS ( As Using @property retain )
.h
@ interface MyClass : NSObject {
UILabel *mTextLabel;
}
@property (nonatomic, retain) UILabel *mTextLabel;
並在MyClass.m中聲明@synthesize mTextLabel ;
然后釋放這樣的對象。
[self setMTextLabel:nil];
[mTextLabel release];
NSLog (@"%d",[mTextLabel retainCount]);
此結果為0。我沒有發現任何錯誤或中斷。
但。 當我像這樣發布mTextLabel時。 我剛得到EXC_BAD_ACCESS
[mTextLabel release];
[self setMTextLabel:nil];
我不明白為什么會這樣。 請幫我。
當您具有帶有keep屬性的綜合屬性時,綜合設置器會在設置新值之前在舊的ivar上調用release。
這是第一個示例中發生的情況的展開視圖:
[mTextLabel release];
mTextLabel = nil;
[mTextLabel release];
由於在nil指針上調用方法沒有任何作用,因此沒有問題。
在第二個示例中,正在發生的事情是:
[mTextLabel release];
[mTextLabel release];
mTextLabel = nil;
看到問題了嗎?
編輯:值得注意的是,檢查對象的保留計數很少有用,因為任何數量的Cocoa類都可以出於自己的目的保留它。 您只需要確保每次在對象上調用retain
, alloc
, copy
或new
時,代碼中就會有匹配的release
或autorelease
。
問題是您正在調用release,然后將屬性設置為nil,這還會在將其設置為nil之前將發布發送到mTextLabel
。 當屬性定義為復制或保留時,就會發生這種情況。 您只需要以下代碼。
[mTextLabel release];
mTextLabel = nil;
編輯:
我想在init之外的代碼中添加它,並進行dealloc調用self.mTextLabel = nil
以在必要時正確釋放該屬性的值,而這完全沒問題。 但是,建議不要在init / dealloc調用中使用該屬性 。 在這些情況下,您將需要直接創建/釋放對象,以避免訪問器的副作用。
當您執行[self setMTextLabel:nil]
時,該值已被釋放。 您不需要顯式地釋放該值(除非您使用init
或copy
方法創建了該值,在這種情況下,應在將其分配給self.mTextLabel
立即釋放它)。
請注意, retainCount
的返回類型為NSUInteger
,因此永遠不能為負。 因此檢查以確保保留計數為零而不是-1不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.