天天看點

認識retain copy assign strong weak 的差別

retain: 引用計數+1 目的:不讓這個對象釋放掉——》MRC-》ARC  strong  weak  copy : 拷貝 為了原資料更改 影響使用之後的資料 -> 使用copy(拷貝的内容 必須遵守拷貝協定)數組 字典 字元串 assign:直接指派 用于基本資料類型 -> 也包含演化出來的類型 int NSInteger BOOL float。。。 strong:強引用->不會被輕易釋放掉->當對象使用完畢之後 對象釋放掉強引用的對象才會被釋放掉-》ARC UI控件 自己建立類聲明的對象 weak:弱引用->當出現記憶體警告的時候 告訴編譯器 可以釋放掉這個對象  UI控件 聲明的對象

數字的 使用assgin 數組 字典 字元串 使用copy 其他  使用strong  weak

另外,我在網上還查到一些其他; 凡是nsstring,就用copy,定義一個模型對象,就用strong,隻是指派的,例如int、double、char 以及CGRect類似的就用assign。 當用copy時,set方法會先release舊值,再copy一個新的對象,reference count 為1(減少了對上下文的依賴);當用assign,直接指派,無retain操作。當用retain,release舊值,retain新值;

而strong與weak的差別

strong類似于retain,會将對象的引用計數器+1,配置設定記憶體位址。

weak類似于指針,隻是單純的指向某個位址,但是本身并未配置設定記憶體位址。當指向的位址被銷毀時,該指針會自動nil。

例子:

  1.    @synthesize string1;   

  2.    @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);  

結果是:String 2 = null

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

   總之,這些需要區分開,對于屬性構造方法有很大幫助,可以省去許多麻煩。

繼續閱讀