2012-06-25 77 views
0

我正在學習有關的財產,我讀各種文件,但仍有關如何物業工作不明確,橫跨其迷惑我,我創造了我創建了一個屬性的一個示例應用程序如下場景傳來:財產如何運作?

@property(nonatomic,retain)NSString *strValue; 

和合成它:

@synthesize strValue; 

1)第一種方案:

在viewDidLoad中我寫道:

strValue = [[NSString stringWithFormat:@"value"] retain]; 

在dealloc中我寫道:

NSLog(@"str value : %@",self.strValue); 
[self.strValue release]; 

它工作得很好,沒有任何問題leak.My這裏是:發生了什麼事內存時,我創建留置物strValue中(@屬性(非原子,保留)的NSString被保留* strValue的;)?

2)第二方案:

在viewDidLoad中我寫道:

self.strValue = [[NSString stringWithFormat:@"value"] retain]; 

在的dealloc我寫道:

NSLog(@"str value : %@",self.strValue); 
[self.strValue release]; 

這表明內存泄漏在self.strValue = [[NSString的stringWithFormat :@「value」] retain] line.Question here is:它爲什麼在這裏顯示內存泄漏?這行代碼是不是等同於以下代碼行:

[strValue release]; 
[strValue retain]; 

3)第三種情況: 在viewDidLoad中我寫道:

self.strValue = [NSString stringWithFormat:@"value"]; 

在dealloc中我寫道:

NSLog(@"str value : %@",self.strValue); 
[self.strValue release]; 

它沒有任何內存泄漏或叼着參考,是如何工作的罰款? 任何人都可以解釋屬性是如何工作的嗎?當我們使用屬性時如何分配和釋放內存?

回答

1

第一個問題,

因爲您的實例設置爲變量本身,而不是財產,那麼你將必須分配(或保留)給定的情況下,如果你給了這個變量的自動釋放的對象,後來在物業將成爲殭屍

第二個問題

沒有它不是S因爲該屬性已經保留了該實例,所以另一個保留會將保留計數增加一個額外的保留計數,因此您將有一個額外的保留計數,不會被永久釋放。

第三個問題

正如我剛纔所說的屬性將保留實例所以會有通過自動釋放實例,它

這裏是一個示例保留的屬性設置

沒問題
- (void) setProperty:(BookItem *)prop 
{ 
    if(_property != prop) 
    {  
     [_property release];//release old 
     _property = prop; 
     [prop retain]; //retain new 
    } 
} 
+0

謝謝你我的疑問,快速answer.Much是我的第一個問題我還沒有使用屬性,我用實例變量directly.So中明確now.But這種情況下它不會釋放先前的實例,對吧? –

+0

是的,它不會。你是對的,我沒有注意到它,如果你想設置的變量它的自我,那麼你將不得不分配,這就是爲什麼您沒有收到泄漏 –

+0

能否請您詳細闡述我的故事嗎? –