一舉拿下ios屬性的關鍵字

attributes
Attributes Attributes
atomic nonatomic
strong weak
readwrite readonly
getter setter
copy assign
retain unsafe_unretained

atomic

如果沒有指明是nonatomic的狐胎,那么默認就是atomic醉冤。atomic的意思是數(shù)據(jù)的讀寫是線程安全的韩容,這在多線程的時候非常有用艺骂,但是與nonatomic相比的話效率會低很多汞舱。所以為了提升效率界睁,除非是在明確知道對象會在多線程中使用,否則盡量使用nonatomic關鍵字兵拢。

nonatomic

nonatomic不能保證數(shù)據(jù)的原子性翻斟,也就是說在多線程訪問的時候不能保證能夠正確讀取數(shù)據(jù),甚至有可能發(fā)生崩潰说铃。如果使用了nonatomic關鍵字访惜,這時候如果存在多線程訪問的話,需要自己來處理線程的安全問題腻扇。

retain

ARC之前使用的關鍵字债热,ARC之后用strong代替。

strong

這是一個ARC之后才有的屬性幼苛,在使用ARC的時候窒篱,這是一個默認屬性。與它對應的是weak屬性舶沿。strong使類能夠擁有對象的所有權墙杯,會增加對象的 retain count 以保證在類使用該對象的時候,對象沒有被銷毀括荡。strong可能會導致retain cycle高镐,要謹慎使用,常使用在繼承自NSObject的類和大部分自定義類畸冲。
官方文檔介紹:

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;

表示了strong和retain是同義詞嫉髓。

unsafe_unretained

ARC之前使用的關鍵字,類似于weak邑闲,但與weak不同的是在對象被銷毀后算行,指針不會被置為空,所以有可能會造成崩潰

Paste_Image.png

weak (weak 對象釋放的時候苫耸,怎么置為nil的呢州邢?請閱讀iOS 底層解析weak的實現(xiàn)原理

只是將指針指向該對象,但是并沒有對象的所有權鲸阔,在對象被釋放的時候偷霉,weak指針會被置為nil,這保證了指針的安全褐筛, 在OC里是可以給nil對象發(fā)送消息而不會崩潰的类少,但是如果給一個被釋放的對象發(fā)送消息就會崩潰了。weak不會增加對象的 retain count渔扎。

assign

簡單數(shù)據(jù)類型(int硫狞,long,double晃痴, float残吩,Bool)默認就是assign的,不改變對象的retainCount倘核。最好是只在簡單數(shù)據(jù)類型時使用泣侮,對于對象類型,最好不要使用

readwrite

所有的屬性默認都是readwrite的紧唱,使用readonly關鍵字可以覆蓋該默認值活尊。

readonly

表示對象是只讀的。當我們不希望外面的類可以修改該屬性的時候漏益,可以在頭文件中將屬性定位readonly蛹锰,但是在實現(xiàn)文件中,我們可以將它聲明為readwrite绰疤,這樣就只能在類內(nèi)部才能修改這個屬性了铜犬。

getter

指定get方法, 并需要實現(xiàn)這個方法. 必須返回與聲明類型相同的變量,沒有參數(shù).

setter

指定 set 方法, 并需要實現(xiàn)這個方法. 帶一個與聲明類型相同的參數(shù), 沒有返回值(返回nil)當聲明為 readonly 的時候, 不能指定 set 方法.
默認情況下,系統(tǒng)會生成一個與屬性同名的getter轻庆、setter 方法癣猾,

copy copy還是strong?用copy還是mutablecopy

與strong不同的是余爆,copy不會增加對象的 retain count煎谍,
而是會重新復制一份對象,然后將指針指向新復制的對象龙屉。
使用copy關鍵字的屬性的類型必須遵循NSCopying協(xié)議呐粘。
含有可深拷貝NSCopy子類的類,如NSArray,NSSet, NSDictionary, NSData, NSCharacterSet, NSIndexSet, NSString 等一般都用copy來修飾. 這是因為父類的指針可以指向子類對象, 使用copy的目的就是為了對象本身不受外界影響, 無論傳給我一個可變還是不可變的對象, 我本身持有的都是一個不可變對象.

假如有一個屬性是NSString類型的转捕,但是我們卻將一個NSMutableString賦值給了它(這是合法的)作岖,如果我們使用strong關鍵字,那么現(xiàn)在這個對象是一個NSMutableString的對象五芝,如果在別的地方修改了這個對象的值痘儡,那么該屬性也跟著變了,這可能會帶來意想不到的后果枢步。但如果我們使用copy關鍵字的話沉删,就不會存在這個問題了渐尿,因為它會拷貝一份NSMutableString的值,這時屬性依然是 immutable 的矾瑰,即使NSMutableString的對象修改了也不會影響屬性的值砖茸。

Block為什么使用copy修飾

DemoBlock內(nèi)部沒有調(diào)用外部變量時存放在全局區(qū)(ARC和MRC下均是)
DemoBlock2使用了外部變量,這種情況也正式我們平時所常用的方式,Block的內(nèi)存地址顯示在棧區(qū),棧區(qū)的特點就是創(chuàng)建的對象隨時可能被銷毀,一旦被銷毀后續(xù)再次調(diào)用空對象就可能會造成程序崩潰,在對block進行copy后,block存放在堆區(qū).所以在使用Block屬性時使用Copy修飾,而在ARC模式下,系統(tǒng)也會默認對Block進行copy操作

@synthesis

告訴編譯器自動生成屬性的 getter 和 setter 方法,并且為屬性綁定一個成員變量,也就是說將屬性的訪問器方法作用于綁定的成員變量。正常情況下可以不使用@synthesis關鍵字破花,編譯器也會默認生成訪問器方法书斜,在一些特殊情況下,需要明確使用@synthesis關鍵字才能生成訪問器方法,包括以下情況:

  • 綁定非默認的實例變量。
    默認情況下,系統(tǒng)會生成一個_ 的成員變量與屬性綁定在一起征绎,如果不想使用系統(tǒng)生成的成員變量的話,可以通過@synthesis name = customName來綁定一個自定義的成員變量名磨取。

  • 協(xié)議中定義的屬性炒瘸。
    當類實現(xiàn)的協(xié)議中包含屬性時,必須在類中明確使用@synthesis才能生成訪問器方法

  • 重寫訪問器方法寝衫。
    在重寫 getter 和 setter 的時候需要用與屬性相關的成員變量顷扩,由于重寫了 getter 和 setter ,系統(tǒng)不會在默認合成這兩個方法慰毅,也不會默認生成一個帶下劃線的成員變量隘截,這時需要使用@synthesis關鍵字來定一個與屬性對應的成員變量。

  • 類別(category)中定義的所有屬性

  • 重載的屬性
    重寫了 setter 和 getter 或者只讀屬性的getter時

@dynamic

目的是告訴編譯器訪問器方法沒有本類中實現(xiàn)汹胃,而是在別的地方(比如父類)中實現(xiàn)了婶芭,編譯器就不會再發(fā)出警告了。主要是用在CoreData的NSManagedObject子類中着饥。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犀农,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宰掉,更是在濱河造成了極大的恐慌呵哨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轨奄,死亡現(xiàn)場離奇詭異孟害,居然都是意外死亡,警方通過查閱死者的電腦和手機挪拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門挨务,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事谎柄《≈叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵朝巫,是天一觀的道長鸿摇。 經(jīng)常有香客問我,道長捍歪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任鸵钝,我火速辦了婚禮糙臼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恩商。我一直安慰自己变逃,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布怠堪。 她就那樣靜靜地躺著揽乱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粟矿。 梳的紋絲不亂的頭發(fā)上凰棉,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音陌粹,去河邊找鬼撒犀。 笑死,一個胖子當著我的面吹牛掏秩,可吹牛的內(nèi)容都是我干的或舞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蒙幻,長吁一口氣:“原來是場噩夢啊……” “哼映凳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邮破,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤诈豌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抒和,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體队询,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年构诚,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚌斩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖送膳,靈堂內(nèi)的尸體忽然破棺而出员魏,到底是詐尸還是另有隱情,我是刑警寧澤叠聋,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布撕阎,位于F島的核電站,受9級特大地震影響碌补,放射性物質(zhì)發(fā)生泄漏虏束。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一厦章、第九天 我趴在偏房一處隱蔽的房頂上張望镇匀。 院中可真熱鬧,春花似錦袜啃、人聲如沸汗侵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晰韵。三九已至,卻和暖如春熟妓,著一層夾襖步出監(jiān)牢的瞬間雪猪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工起愈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浪蹂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓告材,卻偏偏與公主長得像坤次,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斥赋,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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

  • 本文原創(chuàng)缰猴。僅限站內(nèi)轉(zhuǎn)載,站外轉(zhuǎn)載請私信聯(lián)系作者疤剑。 “The past is a bucket of ashes” ...
    塵世小書蟲閱讀 2,191評論 0 0
  • 提起戰(zhàn)略滑绒,往往會給人云山霧繞的感覺。簡單講隘膘,戰(zhàn)略決定的是一個公司到底往哪走的問題疑故。如果你還不明白什么是戰(zhàn)略,本文作...
    f74245ad6124閱讀 162評論 0 0
  • 從西藏回來后,應妹妹“蟲子”的邀請住在她家,協(xié)助她帶幾天小孩钦铁。原本今天就得回去软舌,可是心里不太情愿走,口頭上說走牛曹,人...
    木棉寶貝閱讀 230評論 0 0
  • “它是生物體內(nèi)的一種無形的“時鐘”佛点,實際上是生物體生命活動的內(nèi)在節(jié)律性,它是由生物體內(nèi)的時間結(jié)構(gòu)序所決定黎比〕” 十二...
    忒膽小閱讀 401評論 0 0