天天看點

@property中strong跟weak的差別

strong關鍵字與retain關似,用了它,引用計數自動+1,用執行個體更能說明一切

@property (nonatomic, strong) NSString *string1;   

@property (nonatomic, strong) NSString *string2;  

有這樣兩個屬性,

 @synthesize string1;   

@synthesize string2;  

猜一下下面代碼将輸出什麼結果?

self.string1 = @"String 1";   

self.string2 = self.string1;   

self.string1 = nil;  

NSLog(@"String 2 = %@", self.string2);  

結果是:String 2 = String 1

由于string2是strong定義的屬性,是以引用計數+1,使得它們所指向的值都是@"String 1", 如果你對retain熟悉的話,這了解并不難。

接着我們來看weak關鍵字:

如果這樣聲明兩個屬性:

@property (nonatomic, weak) NSString *string2;  

并定義 

@synthesize string1;   

再來猜一下,下面輸出是什麼?

 self.string1 = @"String 1";   

結果是:String 2 = null

分析一下,由于self.string1與self.string2指向同一位址,且string2沒有retain記憶體位址,而self.string1=nil釋放了記憶體,是以string1為nil。聲明為weak的指針,指針指向的位址一旦被釋放,這些指針都将被指派為nil。這樣的好處能有效的防止野指針。在c/c++開發過程中,為何大牛都說指針的空間釋放了後,都要将指針賦為NULL. 在這兒用weak關鍵字幫我們做了這一步。

本文轉自蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366473,如需轉載請自行聯系原作者

繼續閱讀