iOS 的strong和copy

之前有過一篇文章關于iOS 屬性的 iOS指示符 assign摹菠、copy套啤、retain、strong改化、weak,之后看了一遍有總結了一下:

NSString 選 Strong 還是copy枉昏?

1陈肛、現(xiàn)分別創(chuàng)建NSString 的strong 和 copy 兩個屬性


@property(nonatomic, strong) NSString *age1;
@property(nonatomic, copy) NSString *age2; 

2、創(chuàng)建一個NSString 常量凶掰,賦值給上面的age1和age2兩個屬性燥爷。

    NSString *age = @"11";
    NSLog(@"age:  %@ - %p", age, age);
    self.age1 = age;
    self.age2 = age;
    NSLog(@"age1: %@ - %p", self.age1, self.age1);
    NSLog(@"age2: %@ - %p", self.age2, self.age2);
    
    NSString *ageOther = [age stringByAppendingString:@"20"];
    NSLog(@"age:  %@ - %p", age, age);
    NSLog(@"ageother:  %@ - %p", ageOther, ageOther);
    NSLog(@"age1: %@ - %p", self.age1, self.age1);
    NSLog(@"age2: %@ - %p", self.age2, self.age2);

3、結果:

 age:  11 - 0x108f28078              
 age1: 11 - 0x108f28078              
 age2: 11 - 0x108f28078              
 age:  11 - 0x108f28078              
 ageother:  1120 - 0x600000255000    
 age1: 11 - 0x108f28078              
 age2: 11 - 0x108f28078              

分析:
我們可以發(fā)現(xiàn)懦窘,給age1和age2 賦值一個不可變的字符串的時候前翎,都進行了淺拷貝,只拷貝了指針地址畅涂,使age港华、age1、age2都指向同一個地址午衰,在對age進行增加字符串時立宜,因為age是不可變字符串,所以age沒有變化臊岸,于是age1橙数、age2都沒有變化。

總結:聲明String和copy屬性的String被不可變String賦值時帅戒,沒有變化灯帮,都是淺拷貝,都不會發(fā)生變化逻住。

1钟哥、現(xiàn)分別創(chuàng)建NSString 的strong 和 copy 兩個屬性


@property(nonatomic, strong) NSString *str1;
@property(nonatomic, copy) NSString *str2;

2、創(chuàng)建一個NSMutableString 可變字符串瞎访,賦值給上面的str1和str2兩個屬性腻贰。

    NSMutableString *name = [[NSMutableString alloc] initWithString:@"Alex"];
    NSLog(@"name : %@ - %p", name, name);
    self.str1 = name;
    self.str2 = name;
    NSLog(@"str1 %@ - %p", self.str1, self.str1);
    NSLog(@"str2 %@ - %p", self.str2, self.str2);
    
    [name appendString:@"Le"];
    
    NSLog(@"str1 %@ - %p", self.str1, self.str1);
    NSLog(@"str2 %@ - %p", self.str2, self.str2);

3、結果:

 name : Alex - 0x604000255cc0       
 str1 : Alex - 0x604000255cc0       
 str2 : Alex - 0xa00000078656c414   

 str1 : AlexLe - 0x604000255cc0     
 str2 : Alex - 0xa00000078656c414              

分析:
我們可以看出在用可變字符串給屬性變量賦值時扒秸,strong的str1 對name進行淺拷貝播演,只拷貝了地址冀瓦,所以str1和name指向同一個地址,而copy 的 str2 對name 進行了深拷貝写烤,str2將name復制到一個新空間內(nèi)咕幻。
當我們對name增添時,此時我們可以看到和name指向相同的str1的內(nèi)容改變了顶霞,而新開辟空間的str2卻還保持原來的值。

總結:

聲明String和copy屬性的String被可變的NSMutableString name賦值時锣吼,strong類型的會隨可變字符串的變化而變化选浑,但是copy類型的卻不會隨可變字符串的變化而變化。所以當屬性被不可變的字符串賦值時玄叠,strong和copy沒有區(qū)別古徒;當屬性被可變字符串賦值時,copy不會被修改读恃,而strong會被修改隧膘。綜上所述,copy更簡單寺惫、安全疹吃。

NSArray 和 NSMutableArray 是 copy 還是 strong?

1西雀、NSMutableArray 不能被copy修飾萨驶,因為以后對數(shù)組的增刪改操作在copy之后數(shù)組都會變成不可變數(shù)組,對其進行增刪改都將crash艇肴。

      @property (copy) NSMutableArray * a;
      NSMutableArray* b = [NSMutableArray array];
      a = b;

等同于

       @property (strong) NSMutableArray * a;
       NSMutableArray* b = [NSMutableArray array];
       a = [b copy];

a在被copy之后就變成了不可變數(shù)組NSArray了腔呜。

2、NSMutableArray 被strong修飾再悼,在賦值的時候就如上面說的那樣會指向同一個地址核畴,被定義的屬性也不會改變。

@property(nonatomic, strong) NSMutableArray *arrayA;
@property(nonatomic, copy) NSMutableArray *arrayB;
    NSMutableArray *arrayC = [NSMutableArray array];
    NSLog(@"arrayC.class: %@ - %p", arrayC.class, arrayC);
    self.arrayA = arrayC;
    self.arrayB = arrayC;
    NSLog(@"arrayA.class: %@ - %p", _arrayA.class, _arrayA);
    NSLog(@"arrayB.class: %@ - %p", _arrayB.class, _arrayB);
    
    [self.arrayA removeAllObjects];
    [self.arrayB removeAllObjects];

結果:

arrayC.class: __NSArrayM - 0x604000251220                                                                                                                                   
arrayA.class: __NSArrayM - 0x604000251220                                                                                                                                   
arrayB.class: __NSArray0 - 0x6000000021a0                                                                                                                                   
-[__NSArray0 removeAllObjects]: unrecognized selector sent to instance 0x6000000021a0                                                                                       
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArray0 removeAllObjects]: unrecognized selector sent to instance 0x6000000021a0' 

分析:我們可以看到arrayA 和 arrayC的指向同一個地址冲九,且類型都是mutable的谤草,arrayB的類型發(fā)生了改變變成不可變的類型。所以娘侍,NSMutableArray被copy修飾之后就變成不可變的咖刃,在對其操作時容易crash。
而NSArray被copy或者strong修飾的時候和NSString相同憾筏。

1嚎杨、當arrayA被strong修飾,且被可變數(shù)組賦值氧腰,可變數(shù)組arrayMB改變枫浙,被strong修飾屬性arrayA也做同樣修改刨肃,arrayA和arrayMB指向的地址相同;
2箩帚、當array被copy修飾真友,且被可變數(shù)組賦值,可變數(shù)組arrayMB改變紧帕,被copy修飾的屬性arrayB沒有被修改盔然,因為arrayB深拷貝arrayMB,arrayB和arrayMB在兩個內(nèi)存塊中是嗜。
3愈案、不管array被strong、copy修飾鹅搪,只要被不可變數(shù)組賦值站绪,此時都指向同一個內(nèi)存地址。

NSMutable可變的類型最好不要使用copy丽柿,不可變的看需不需要被修改恢准,在看strong 和 copy的定義。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甫题,一起剝皮案震驚了整個濱河市馁筐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坠非,老刑警劉巖眯漩,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻顶,居然都是意外死亡赦抖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門辅肾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來队萤,“玉大人,你說我怎么就攤上這事矫钓∫” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵新娜,是天一觀的道長赵辕。 經(jīng)常有香客問我,道長概龄,這世上最難降的妖魔是什么还惠? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮私杜,結果婚禮上蚕键,老公的妹妹穿的比我還像新娘救欧。我一直安慰自己,他們只是感情好锣光,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布笆怠。 她就那樣靜靜地躺著,像睡著了一般誊爹。 火紅的嫁衣襯著肌膚如雪蹬刷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天频丘,我揣著相機與錄音箍铭,去河邊找鬼。 笑死椎镣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兽赁。 我是一名探鬼主播状答,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刀崖!你這毒婦竟也來了惊科?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亮钦,失蹤者是張志新(化名)和其女友劉穎馆截,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜂莉,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蜡娶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了映穗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窖张。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚁滋,靈堂內(nèi)的尸體忽然破棺而出宿接,到底是詐尸還是另有隱情,我是刑警寧澤辕录,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布睦霎,位于F島的核電站,受9級特大地震影響走诞,放射性物質(zhì)發(fā)生泄漏副女。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一蚣旱、第九天 我趴在偏房一處隱蔽的房頂上張望肮塞。 院中可真熱鬧襟齿,春花似錦、人聲如沸枕赵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拷窜。三九已至开皿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篮昧,已是汗流浹背赋荆。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留懊昨,地道東北人窄潭。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像酵颁,于是被迫代替她去往敵國和親嫉你。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,395評論 8 265
  • ? 前段時間躏惋,在公司跟幾個同事出去吃飯幽污,飯間聊到各種蔬菜,繼而聊到菜園簿姨,聊到小時候的事情距误。然后就想起小時候在...
    3319f86f7c7e閱讀 346評論 3 2
  • 一層月牙白,三絲清涼風扁位,在一個平平常常的早晨准潭,玉蘭花開了。此時有點寒域仇,此地有朵花惋鹅,花瓣如凝雪,花香長精神殉簸。...
    冰夫閱讀 294評論 0 2
  • 從前闰集,江西有個三同年(俗稱老庚),他們自結為拜把兄弟之后般卑,彼此相敬如賓武鲁,和睦相處,關系堪稱其樂融融蝠检。 一天沐鼠,正值三...
    鎮(zhèn)南方良金閱讀 486評論 0 1
  • 1. 繼承 繼承注意事項 子類繼承父類所有變量和方法; 繼承是單向的, 子類所有成員變量和方法 沒有父類的類稱為根...
    李小六_閱讀 2,377評論 0 6