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關鍵字做了這一步。
總之,這些需要區分開,對于屬性構造方法有很大幫助,可以省去許多麻煩。