簡體   English   中英

我不知道為什么我得到EXC_BAD_ACCESS(如使用@property保留)

[英]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類都可以出於自己的目的保留它。 您只需要確保每次在對象上調用retainalloccopynew時,代碼中就會有匹配的releaseautorelease

問題是您正在調用release,然后將屬性設置為nil,這還會在將其設置為nil之前將發布發送到mTextLabel 當屬性定義為復制或保留時,就會發生這種情況。 您只需要以下代碼。

[mTextLabel release];
mTextLabel = nil;

編輯:

我想在init之外的代碼中添加它,並進行dealloc調用self.mTextLabel = nil以在必要時正確釋放該屬性的值,而這完全沒問題。 但是,建議不要在init / dealloc調用中使用該屬性 在這些情況下,您將需要直接創建/釋放對象,以避免訪問器的副作用。

當您執行[self setMTextLabel:nil]時,該值已被釋放。 您不需要顯式地釋放該值(除非您使用initcopy方法創建了該值,在這種情況下,應在將其分配給self.mTextLabel立即釋放它)。

請注意, retainCount的返回類型為NSUInteger ,因此永遠不能為負。 因此檢查以確保保留計數為零而不是-1不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM