strong
關(guān)鍵字與retain
關(guān)似甘耿,用了它搓茬,引用計(jì)數(shù)自動(dòng)+1芽突,用實(shí)例更能說明一切
@property (nonatomic, strong) NSString *string1;
@property (nonatomic, strong) NSString *string2;
有這樣兩個(gè)屬性试浙,
@synthesize string1;
@synthesize string2;
猜一下下面代碼將輸出什么結(jié)果?
self.string1 = @"String 1";
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@", self.string2);
結(jié)果是:String 2 = String 1#
由于string2
是strong
定義的屬性寞蚌,所以引用計(jì)數(shù)+1田巴,使得它們所指向的值都是@"String 1"
, 如果你對retain
熟悉的話,這理解并不難挟秤。
接著我們來看weak
關(guān)鍵字:
如果這樣聲明兩個(gè)屬性:
@property (nonatomic, strong) NSString *string1;
@property (nonatomic, weak) NSString *string2;
并定義
@synthesize string1;
@synthesize string2;
再來猜一下壹哺,下面輸出是什么?
self.string1 = @"String 1";
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@", self.string2);
結(jié)果是:String 2 = null#
分析一下艘刚,由于self.string1
與self.string2
指向同一地址管宵,且string2
沒有retain
內(nèi)存地址,而self.string1=nil
釋放了內(nèi)存,所以string1
為nil
箩朴。聲明為weak
的指針岗喉,指針指向的地址一旦被釋放,這些指針都將被賦值為nil
炸庞。這樣的好處能有效的防止野指針钱床。在c/c++
開發(fā)過程中,為何大牛都說指針的空間釋放了后埠居,都要將指針賦為NULL
. 在這兒用weak
關(guān)鍵字幫我們做了這一步查牌。