老師說過,凡是nsstring,就用copy,定義一個(gè)模型對(duì)象,就用strong,只是賦值的,例如int、double、char 以及CGRect類似的就用assign。
自己的筆記如下~
這些關(guān)鍵字基本上是針對(duì)屬性的set方法。
當(dāng)用copy時(shí),set方法會(huì)先release舊值,再copy一個(gè)新的對(duì)象,reference count 為1(減少了對(duì)上下文的依賴);當(dāng)用assign,直接賦值,無retain操作。當(dāng)用retain,release舊值,retain新值;
而strong與weak的區(qū)別
strong類似于retain,會(huì)將對(duì)象的引用計(jì)數(shù)器+1,分配內(nèi)存地址。
weak類似于指針,只是單純的指向某個(gè)地址,但是本身并未分配內(nèi)存地址。當(dāng)指向的地址被銷毀時(shí),該指針會(huì)自動(dòng)nil。
例子:
- @synthesize string1;
- @synthesize string2;
再來猜一下,下面輸出是什么?
1. self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];
2. self.string2 = self.string1;
3. self.string1 = nil;
4. 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)鍵字做了這一步。