iOS開發(fā)中@property后面可以跟哪些修飾符以及我對(duì)ARC的理解

2016.5.30更新:

經(jīng)評(píng)論區(qū)提醒:
其實(shí)還有兩個(gè)特性:為空性nullability和自定義gettersetter方法名屬性重抖。
這兩個(gè)特性比較簡(jiǎn)單也不太常用露氮,所以就不納入文章。

2016.6.3更新:

今天在《iOS編程》書中看到钟沛,block對(duì)象的屬性聲明應(yīng)該為copy(本文之前的觀點(diǎn)是weak)更為準(zhǔn)確畔规。因?yàn)?code>Block對(duì)象是在棧中創(chuàng)建的,而其他對(duì)象是在堆中創(chuàng)建的恨统。這意味著叁扫,即使應(yīng)用針對(duì)新創(chuàng)建的Block對(duì)象保留了強(qiáng)引用類型的指針,一旦創(chuàng)建該對(duì)象的方法返回畜埋,那么與方法內(nèi)部的其他局部變量相同莫绣,新創(chuàng)建的Block對(duì)象也會(huì)被立即釋放。為了在聲明Block對(duì)象的方法返回后仍然保留該對(duì)象由捎,必須向其發(fā)送copy消息兔综。拷貝某個(gè)Block對(duì)象時(shí)狞玛,應(yīng)用會(huì)在堆中創(chuàng)建該對(duì)象的備份软驰。這樣,即使應(yīng)用釋放了當(dāng)前方法的棧心肪,堆中的Block對(duì)象也不會(huì)被釋放锭亏。

2016.6.3更新:

本文之前指出IBOutlet屬性應(yīng)該設(shè)為weak,但是在WWDC2015上Apple官方推薦IBOutlet屬性應(yīng)該設(shè)為strong硬鞍,除非需要避免引用循環(huán)的屬性才設(shè)置為weak慧瘤。在stackoverflow上有關(guān)于這個(gè)問(wèn)題的討論,我覺得最佳實(shí)踐應(yīng)該是頂層視圖的IBOutlet屬性使用strong固该,子視圖的使用weak锅减。(《iOS編程》中也是這個(gè)觀點(diǎn))
詳見:http://stackoverflow.com/questions/7678469/should-iboutlets-be-strong-or-weak-under-arc


最近在找實(shí)習(xí)工作,幾乎每次面試都會(huì)被問(wèn)及@property后的三個(gè)關(guān)鍵字伐坏。網(wǎng)上不是說(shuō)面試一個(gè)人的iOS開發(fā)水平怔匣,問(wèn)個(gè)property就大概知道了。所以今天花了一些時(shí)間總結(jié)了一下桦沉,這些內(nèi)容都來(lái)自于我看過(guò)的書以及在網(wǎng)上查閱的一些資料每瞒。

在iOS開發(fā)中,任何一個(gè)屬性都有三個(gè)特性(@property后面可以跟三個(gè)關(guān)鍵字)纯露,每個(gè)特性都有多種不同的可選類型剿骨。

多線程特性

默認(rèn):atomic

  • atomic:原子的。表示線程安全埠褪。使用atomic的目的是為了確保其他線程不在同一時(shí)間內(nèi)訪問(wèn)相同的資源浓利。(編譯器會(huì)自動(dòng)生成互斥加鎖的代碼挤庇,避免變量的讀寫不同步)但往往即使聲明了atomic屬性也不能一定保證線程安全,而且這種機(jī)制是耗費(fèi)系統(tǒng)資源的荞膘。(所以一般都聲明為nonatomic屬性)

  • nonatomic:非原子的罚随。表示非線程安全∮鹱剩可以在不同的地方讀取和設(shè)置屬性的值淘菩。(可能會(huì)導(dǎo)致讀寫不同步)編譯器會(huì)少生成一些互斥加鎖的代碼,可以提高效率屠升。

總結(jié):涉及到多線程的時(shí)候潮改,使用atomic,保證安全腹暖。不涉及多線程汇在,使用nonatomic,效率更高脏答。

原子操作:是指不會(huì)被線程調(diào)度機(jī)制打斷的操作糕殉。原子操作一旦開始,就要一直運(yùn)行到結(jié)束殖告,不會(huì)被打斷阿蝶。

讀寫特性

默認(rèn):readwrite

  • readwrite:編譯器會(huì)為屬性生成get方法和set方法
  • readonly:編譯器只生成get方法

readonly一般用于設(shè)置內(nèi)部數(shù)據(jù)的訪問(wèn)權(quán)限:某個(gè)對(duì)象中有一種可修改的數(shù)據(jù),但是除該對(duì)象外黄绩,其他數(shù)據(jù)只能訪問(wèn)該數(shù)據(jù)而不能修改它羡洁。這時(shí)我們就可以為該數(shù)據(jù)另外設(shè)置一個(gè)readonly屬性僅供外界讀取,修改則在該對(duì)象中修改readwrite屬性的數(shù)據(jù)爽丹。(這也是一種常用的設(shè)計(jì)模式)

內(nèi)存管理特性(我對(duì)ARC的理解)

默認(rèn):strong
iOS5后使用ARC來(lái)管理內(nèi)存筑煮。ARC的原則:只要某個(gè)對(duì)象被任一strong指針指向,那么他將不會(huì)被銷毀粤蝎。當(dāng)對(duì)象沒有被任何strong指針指向真仲,那么該對(duì)象將被銷毀。

  • strong:使用strong屬性會(huì)引起引用計(jì)數(shù)加1初澎。是指針拷貝(淺拷貝)袒餐,不會(huì)拷貝內(nèi)容。當(dāng)有某個(gè)strong指針指向某個(gè)對(duì)象時(shí)谤狡,該對(duì)象不會(huì)被銷毀,只有當(dāng)strong指針設(shè)定了新的值卧檐,或是超出了作用范圍時(shí)墓懂,該strong指針就不再持有該對(duì)象,倘若該對(duì)象不被其他strong指針持有霉囚,該對(duì)象就會(huì)被釋放捕仔。

  • weak:表示一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不釋放舊值榜跌,也不保留新值闪唆,不會(huì)使引用計(jì)數(shù)加1。當(dāng)所指對(duì)象被銷毀時(shí)钓葫,指針會(huì)自動(dòng)被置為nil悄蕾,防止野指針。
    【適用范圍:delegate,IBOutlet屬性】
    weak指針還可以解決強(qiáng)引用循環(huán)(strong reference cycle/retain cycle):當(dāng)兩個(gè)或兩個(gè)以上對(duì)象之間互相強(qiáng)引用時(shí)础浮,無(wú)法通過(guò)ARC來(lái)釋放對(duì)象帆调,可能會(huì)導(dǎo)致內(nèi)存泄漏。解決辦法是將其中一個(gè)指針改為weak豆同。具體改哪一個(gè)番刊,可以為存在強(qiáng)引用循環(huán)的對(duì)象決定父子關(guān)系。父對(duì)象應(yīng)該使用具有強(qiáng)引用特性的指針指向子對(duì)象影锈,子對(duì)象應(yīng)該使用具有弱引用特性的指針指向父對(duì)象芹务。

  • copy:先copy一個(gè)相同對(duì)象,再創(chuàng)建一個(gè)strong指針鸭廷。(深拷貝枣抱,會(huì)拷貝內(nèi)容)
    【當(dāng)某對(duì)象的類具有可修改的子類時(shí),應(yīng)該將屬性設(shè)為copy靴姿。例如:NSString沃但,NSArrayNSDictionary
    這樣做的原因是:如果屬性指向的對(duì)象的類具有可修改的子類佛吓,那個(gè)該屬性可能會(huì)指向可修改的子類對(duì)象宵晚,同時(shí)該子類對(duì)象可能會(huì)被其他擁有者修改。因此维雇,最好先復(fù)制該對(duì)象淤刃,然后再將屬性指向復(fù)制后的對(duì)象。(編寫具有“防御性”的代碼)

@property (nonatomic, copy) NSString *string_1;
@property (nonatomic, strong) NSMutableString *string_2;
self.string_2 = [[NSMutableString alloc] init];
self.string_1 = self.string_2;

上述代碼中string_2可能會(huì)被改變吱型,但是string_1是不可變類型的逸贾。】
擴(kuò)展:這個(gè)寫法會(huì)出什么問(wèn)題:

@property (nonatomic津滞,copy) NSMutableArray *array;

添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法(unrecognised selector)而崩潰.因?yàn)?copy 就是復(fù)制一個(gè)不可變 NSArray的對(duì)象铝侵。

  • unsafe_unretained:(不安全不引用)用于非對(duì)象屬性(即:基本數(shù)據(jù)類型),這類屬性不需要做內(nèi)存管理触徐,它表示存取方法會(huì)直接為實(shí)例變量賦值咪鲜。【MRC時(shí)期使用assign
    【unsafe是相對(duì)于weak而言的撞鹉。unsafed_unretained類型的指針指向的對(duì)象被銷毀時(shí)疟丙,指針不會(huì)自動(dòng)設(shè)置為nil颖侄,而是成為空指針,因此不安全享郊。但是當(dāng)處理非對(duì)象屬性時(shí)是不會(huì)出現(xiàn)空指針問(wèn)題的】
    【unretained是指不會(huì)引起引用計(jì)數(shù)加1】

補(bǔ)充:

MRC時(shí)期的關(guān)鍵字:

  • assign(賦值):表示簡(jiǎn)單的直接賦值操作览祖。
    • 用于基本數(shù)據(jù)類型(NSIntegerCGFloat等)和C數(shù)據(jù)類型(int炊琉,float展蒂,double等)
    • 用于id類型。(比如delegate屬性温自,使用weak可以避免出現(xiàn)強(qiáng)引用循環(huán))【當(dāng)id類型使用assign時(shí)玄货,對(duì)象被銷毀,指針不會(huì)被置空悼泌,可能會(huì)引起空指針】
      在引入ARC后松捉,assign的第一個(gè)功能已經(jīng)被unsafed_unretained取代,第二個(gè)功能被weak取代
  • retain(持有):先release原來(lái)的值馆里,再retain新值(引用計(jì)數(shù)會(huì)自動(dòng)加1)隘世。
-(void)setA:(ClassA *)a{
    if(_a!=a){
        [_a release];
        _a=[a retain];
    }
}

在引入ARC后,使用strong代替retain

當(dāng)然以上只是我目前的理解鸠踪,我相信以后肯定會(huì)有更深的理解丙者。所以我會(huì)隨時(shí)更新我的新看法的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末营密,一起剝皮案震驚了整個(gè)濱河市械媒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌评汰,老刑警劉巖纷捞,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異被去,居然都是意外死亡主儡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門惨缆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糜值,“玉大人,你說(shuō)我怎么就攤上這事坯墨〖呕悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵捣染,是天一觀的道長(zhǎng)健无。 經(jīng)常有香客問(wèn)我,道長(zhǎng)液斜,這世上最難降的妖魔是什么累贤? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮少漆,結(jié)果婚禮上臼膏,老公的妹妹穿的比我還像新娘。我一直安慰自己示损,他們只是感情好渗磅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著检访,像睡著了一般始鱼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆贵,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天医清,我揣著相機(jī)與錄音,去河邊找鬼卖氨。 笑死会烙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筒捺。 我是一名探鬼主播柏腻,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼系吭!你這毒婦竟也來(lái)了五嫂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肯尺,失蹤者是張志新(化名)和其女友劉穎沃缘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟆盹,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孩灯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逾滥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峰档。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寨昙,靈堂內(nèi)的尸體忽然破棺而出讥巡,到底是詐尸還是另有隱情,我是刑警寧澤舔哪,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布欢顷,位于F島的核電站,受9級(jí)特大地震影響捉蚤,放射性物質(zhì)發(fā)生泄漏抬驴。R本人自食惡果不足惜炼七,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望布持。 院中可真熱鬧豌拙,春花似錦、人聲如沸题暖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胧卤。三九已至唯绍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枝誊,已是汗流浹背况芒。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侧啼,地道東北人牛柒。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痊乾,于是被迫代替她去往敵國(guó)和親皮壁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 1.1 什么是自動(dòng)引用計(jì)數(shù) 概念:在 LLVM 編譯器中設(shè)置 ARC(Automaitc Reference Co...
    __silhouette閱讀 5,081評(píng)論 1 17
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,962評(píng)論 0 7
  • Cocoa內(nèi)存管理機(jī)制 (1)當(dāng)你使用new、alloc湿滓、copy方法創(chuàng)建一個(gè)對(duì)象時(shí)滴须,該對(duì)象的保留計(jì)數(shù)器值為1.當(dāng)...
    John_LS閱讀 2,764評(píng)論 0 6
  • 1 是否有寫文章時(shí)可供征引的資源庫(kù)?如果有叽奥,是哪一方面扔水?已經(jīng)讀過(guò)了哪些書籍? 如果資源庫(kù)不局限于書籍的話朝氓,那它倒是...
    一個(gè)文字狗閱讀 264評(píng)論 4 2
  • 今日魔市,半天的時(shí)間到中國(guó)人大文化大廈聽了人類學(xué)論壇,收獲及感觸如下:1.禮物及互惠是文化人類學(xué)的基本而重要的概念赵哲,從...
    暮山紫閱讀 186評(píng)論 0 0