iOS中assign溶其、copy 、retain等關(guān)鍵字的含義

assign: 簡單賦值敦间,不更改索引計數(shù)
copy: 建立一個索引計數(shù)為1的對象瓶逃,然后釋放舊對象
retain:釋放舊的對象,將舊對象的值賦予輸入對象廓块,再提高輸入對象的索引計數(shù)為1

Copy其實是建立了一個相同的對象金闽,而retain不是:
比如一個NSString對象,地址為0×1111剿骨,內(nèi)容為@”STR”
Copy到另外一個NSString之 后,地址為0×2222埠褪,內(nèi)容相同浓利,新的對象retain為1, 舊有對象沒有變化

retain到另外一個NSString之 后钞速,地址相同(建立一個指針贷掖,指針拷貝),內(nèi)容當(dāng)然相同渴语,這個對象的retain值+1

也就是說苹威,retain是指針拷貝,copy是內(nèi)容拷貝驾凶。在拷貝之前牙甫,都會釋放舊的對象。

  • 使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger)和C數(shù)據(jù)類型(int, float, double, char,等)
  • 使用copy: 對NSString
  • 使用retain: 對其他NSObject和其子類

1.readonly表示這個屬性是只讀的调违,就是只生成getter方法窟哺,不會生成setter方法.
2.readwrite,設(shè)置可供訪問級別
3.retain技肩,是說明該屬性在賦值的時候且轨,先release之前的值,然后再賦新值給屬性虚婿,引用再加1旋奢。
4.nonatomic,非原子性訪問然痊,不加同步至朗,多線程并發(fā)訪問會提高性能。注意剧浸,如果不加此屬性爽丹,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問筑煮。

retain和copy還有assign的區(qū)別

  1. 假設(shè)你用malloc分配了一塊內(nèi)存,并且把它的地址賦值給了指針a粤蝎,后來你希望指針b也共享這塊內(nèi)存真仲,于是你又把a賦值給(assign)了b。此時a和b指向同一塊內(nèi)存初澎,請問當(dāng)a不再需要這塊內(nèi)存秸应,能否直接釋放它?答案是否定的碑宴,因為a并不知道b是否還在使用這塊內(nèi)存软啼,如果a釋放了,那么b在使用這塊內(nèi)存的時候會引起程序crash掉延柠。

  2. 了解到1中assign的問題祸挪,那么如何解決?最簡單的一個方法就是使用引用計數(shù)(reference counting)贞间,還是上面的那個例子贿条,我們給那塊內(nèi)存設(shè)一個引用計數(shù),當(dāng)內(nèi)存被分配并且賦值給a時增热,引用計數(shù)是1整以。當(dāng)把a賦值給b時引用計數(shù)增加到2。這時如果a不再使用這塊內(nèi)存峻仇,它只需要把引用計數(shù)減1公黑,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時也把引用計數(shù)減1摄咆。當(dāng)引用計數(shù)變?yōu)?的時候凡蚜,代表該內(nèi)存不再被任何指針?biāo)茫到y(tǒng)可以把它直接釋放掉吭从。

  3. 上面兩點其實就是assign和retain的區(qū)別番刊,assign就是直接賦值,從而可能引起1中的問題影锈,當(dāng)數(shù)據(jù)為int, float等原生類型時芹务,可以使用assign。retain就如2中所述鸭廷,使用了引用計數(shù)枣抱,retain引起引用計數(shù)加1, release引起引用計數(shù)減1,當(dāng)引用計數(shù)為0時辆床,dealloc函數(shù)被調(diào)用佳晶,內(nèi)存被回收。

  4. copy是在你不希望a和b共享一塊內(nèi)存時會使用到讼载。a和b各自有自己的內(nèi)存轿秧。

  5. atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作中跌。在多線程環(huán)境下,原子操作是必要的菇篡,否則有可能引起錯誤的結(jié)果漩符。加了atomic,setter函數(shù)會變成下面這樣:
    if (property != newValue) {
    [property release];
    property = [newValue retain];
    }

關(guān)于retain,copy,assign的區(qū)別問題其實困擾我很久了驱还,因為在程序中不太常用到copy嗜暴,assign,所以三者的具體差別一直不太明白议蟆。
按照我的理解闷沥,assign和retain的區(qū)別,就是引入了一個計數(shù)器retaincount咐容,就可以對一個內(nèi)存的釋放方便很多舆逃。copy,就是把原來的內(nèi)存復(fù)制一遍戳粒,使各自都擁有一個內(nèi)存路狮,這樣釋放的時候也不會出錯。
assign: 簡單賦值享郊,不更改索引計數(shù)(Reference Counting)。
copy: 建立一個索引計數(shù)為1的對象孝鹊,然后釋放舊對象
retain:釋放舊的對象炊琉,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1
使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger又活,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等等)
使用copy: 對NSString
使用retain: 對其他NSObject和其子類
nonatomic苔咪,非原子性訪問,不加同步柳骄,多線程并發(fā)訪問會提高性能团赏。注意,如果不加此屬性耐薯,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問

@property(nonatomic, retain) UITextField *userName編譯時自動生成的代碼

  • (UITextField *) userName {
    return userName;
    }

  • (void) setUserName:(UITextField *)userName_ {
    [userName release];
    userName = [userName_ retain];
    }

@property(retain) UITextField *userName自動生成的代碼

  • (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
    retval = [[userName retain] autorelease];
    }
    return retval;
    }

  • (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
    [userName release];
    userName = [userName_ retain];
    }
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舔清,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子曲初,更是在濱河造成了極大的恐慌体谒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼婆,死亡現(xiàn)場離奇詭異抒痒,居然都是意外死亡,警方通過查閱死者的電腦和手機颁褂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門故响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傀广,“玉大人,你說我怎么就攤上這事彩届∥北” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵惨缆,是天一觀的道長糜值。 經(jīng)常有香客問我,道長坯墨,這世上最難降的妖魔是什么寂汇? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮捣染,結(jié)果婚禮上骄瓣,老公的妹妹穿的比我還像新娘。我一直安慰自己耍攘,他們只是感情好榕栏,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕾各,像睡著了一般扒磁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上式曲,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天妨托,我揣著相機與錄音,去河邊找鬼吝羞。 笑死兰伤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钧排。 我是一名探鬼主播敦腔,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恨溜!你這毒婦竟也來了符衔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤糟袁,失蹤者是張志新(化名)和其女友劉穎柏腻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系吭,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡五嫂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃缘。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡躯枢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出槐臀,到底是詐尸還是另有隱情锄蹂,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布水慨,位于F島的核電站得糜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晰洒。R本人自食惡果不足惜朝抖,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谍珊。 院中可真熱鬧治宣,春花似錦、人聲如沸砌滞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贝润。三九已至绊茧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間打掘,已是汗流浹背华畏。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胧卤,地道東北人唯绍。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓拼岳,卻偏偏與公主長得像枝誊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惜纸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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