2011-11-17 51 views
0

我的目標C初學者和Cocos2d@property和@synthesize和內存錯誤

我讀Features of use @property and @synthesize (cocos2d)

的評論是在內存錯誤引用。這些錯誤是什麼?

在我的代碼我使用:

//interface 
{ 
CC_bla_bla *a; 
} 
@property(nonatomic, retain) CC_bla_bla *a; 


//implementation 
@synthesize a; 

self.a=[CC_bla_bla load_value:123123] 

//dealloc 
[self.a release] 
self.a = nil; 

在一個類中,我總是用self.a的所有操作。那不好嗎?

在什麼意義上使用「實例變量」a?

+0

千萬不要'[self.a release]'! 'self.a = nil'釋放'a',因此你已經釋放了'a',你可能會在某個時候崩潰。 – hypercrypt

回答

0

屬性最常用於從其他視圖控制器獲取和從其中獲取內容。你可以只是在某個視圖控制器中使用屬性,但你必須謹慎。

既然你做的事:

@property(nonatomic, retain) CC_bla_bla *a; 

這有一個1保留計數這是你一個人,你必須在dealloc中釋放出來。但是,假設你做一個= [[CC分配],等等....那麼它將有一個保留計數兩個。

希望你明白這一點。當你需要使用屬性的時候,你會自己實現。

0

屬性只是用來將一些「元數據」關聯到您通過對象訪問此對象時將使用的變量。 @synthesize指令將使用properties config來生成getter和變量的setter。

例如:

self.a = [CC_bla_bla load_value:123123]; // The object is retained because of the property 

// This is equivalent to the previous line 
[self setA:[CC_bla_bla load_value:123123]]; 

// ------ 
// By the same way 
self.a; 

// is equivalent to 
[self a]; 

// ------ 
// method generated by your property 
- (void)setA:(CC_bla_bla *)newA 
{ 
    [newA retain]; 
    [a release]; 
    a = newA; 
} 

但如果你直接使用的變量沒有被你不使用屬性值的對象傳遞。例如:

a = [CC_bla_bla load_value:123123]; // The object is not retained so you may have unexcepted behaviors 

// A good solution 
a = [[CC_bla_bla load_value:123123] retain]; 

我希望它能幫助你澄清一些觀點。爲了進一步閱讀,你可以看這tutorial

0

我認爲你正在處理你的代碼。 總是用自己打電話給你的財產。很好。 但是,只有當[CC_bla_bla loadvalue:]不保留創建的對象時,代碼纔是正確的。如果你的loadvalue函數保留了被創建的對象,並且一個屬性會再次保留它,那麼它應該被釋放兩次。

相關問題