iOS中property的關(guān)鍵字(史上最詳解)

昨天立了flag锅棕,今天就來開始第一篇文章吧。
property的關(guān)鍵字是我們平常寫代碼隨時都會用到的荆烈,只要聲明一個屬性拯勉,就會用到這些關(guān)鍵字竟趾,先從最簡單的講起吧。

一宫峦、如何使用

property的關(guān)鍵字分三類:

  • 一類是表示原子性(也就是線程安全)的岔帽,有atomic和nonatomic,默認是atomic导绷,acomic也就是線程安全犀勒,但是我們一般都用的nonatomic,因為atomic的線程安全開銷太大妥曲,影響性能贾费,即使需要保證線程安全,我們也可以通過自己的代碼控制檐盟,而不用atomic褂萧。
  • 一類是表示引用計數(shù)的,有assign(iOS5以前用unsafe_unretained),strong,weak,copy葵萎。
    assign: assign用于非指針變量导犹,一般用于基礎(chǔ)類型和C數(shù)據(jù)類型,這些類型不是對象羡忘,統(tǒng)一由系統(tǒng)棧進行內(nèi)存管理谎痢。
    weak:對對象的弱引用,不增加對象的引用計數(shù)壳坪,也不持有對象舶得,當對象消失后指針自動指向nil,所以這里也就防止了野指針的存在爽蝴。
    strong:對對象的強引用沐批,會增加對象的引用計數(shù),如果指向了一個空對象蝎亚,會造成野指針九孩,平常我們用得最多的應(yīng)該也是strong了。
    copy:建立一個引用計數(shù)為1的新對象发框,賦值時對傳入值進行一份拷貝躺彬,所以使用copy關(guān)鍵字的時候,你將一個對象復(fù)制給該屬性梅惯,該屬性并不會持有那個對象宪拥,而是會創(chuàng)建一個新對象,并將那個對象的值拷貝給它铣减。而使用copy關(guān)鍵字的對象必須要實現(xiàn)NSCopying協(xié)議她君。
    unsafe_unretained:跟 weak 類似,聲明一個弱引用葫哗,但是當引用計數(shù)為 0 時缔刹,變量不會自動設(shè)置為 nil球涛,現(xiàn)在基本都用weak了。
  • 一類是表示讀寫權(quán)限的校镐,默認是readwrite(可讀可寫)亿扁,還有就是readonly,當你希望暴露出來的屬性不能被外界修改時就需要申明為readonly鸟廓。

二从祝、關(guān)鍵字與內(nèi)存管理

這里重點講一下與內(nèi)存管理相關(guān)的這幾個關(guān)鍵字。
直接上代碼吧

測試

@property (nonatomic,strong) Person *strongPerson;
@property (nonatomic,weak) Person *weakPerson;

試驗代碼

self.strongPerson = [Person new];
self.weakPerson = self.strongPerson;
self.strongPerson = nil; NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

輸出結(jié)果為:
strongStr=(null),weakStr=(null)
這里就足以說明weak修飾的屬性并不會使引用計數(shù)增加

稍微修改代碼肝箱,把weakPerson設(shè)置為nil

self.strongPerson = [Person new];
self.weakPerson = self.strongPerson;
self.weakPerson = nil;
NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

輸出結(jié)果如下:
strongStr=<Person: 0x600000007d50>,weakStr=(null)
說明weak修飾的屬性只是對對象的弱引用哄褒,并不會真正的持有該對象。
再次修改代碼

    Person *p = [Person new];
    self.strongPerson = p;
    self.weakPerson = self.strongPerson;
    p = nil;
    NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

輸出結(jié)果為:
strongStr=<Person: 0x600000200b50>,weakStr=<Person: 0x600000200b50>
這里不用多說煌张,因為strong屬性會強引用該對象并使該對象的引用計數(shù)+1,所以即使把p設(shè)置為nil退客,該對象也并沒有釋放骏融,要想釋放該對象,還得把strongStr設(shè)置為nil萌狂。
self.strongPerson = nil;
這樣輸出結(jié)果就是 strongStr=(null),weakStr=(null)了档玻。

再來看看copy關(guān)鍵字
為了方便試驗,我們直接在ViewController里面加個屬性茫藏。
@property (nonatomic, copy) NSObject *c;

    NSObject *a = [[NSObject alloc]init];
    self.c = a;
    a = nil;
    NSLog(@"%@",self.c);

毫無疑問误趴,輸出結(jié)果不為nil。

    <NSObject: 0x600000010d90>

在這里要重點說一下务傲,使用NSMutableArray,NSMutableDictionary等可變集合對象的時候千萬不要用copy凉当,這里用copy 99%會出錯,因為當你給該屬性賦值時它會自動調(diào)用對象的copy方法售葡,從而將可變集合轉(zhuǎn)換成不可變集合看杭,把一個不可變集合賦值給一個可變集合,就會造成錯誤挟伙。

感覺寫得有些啰嗦楼雹,我覺得主要是給新人看吧,畢竟我自己當初一直對這些關(guān)鍵字也是懵懵懂懂的尖阔,如果看了我這篇文章還是不能理解贮缅,那應(yīng)該是完全不了解內(nèi)存管理方面的知識,MRC介却、ARC應(yīng)該去了解一下谴供,如果后面有需要,我可能會寫一篇相關(guān)的文章筷笨。

另外憔鬼,還請大神門多多指教龟劲。。轴或。昌跌。

更新

之前是用NSString來做的實驗,但是由于字符串的特殊性照雁,所以有點容易誤導(dǎo)大家蚕愤,現(xiàn)在已經(jīng)全部改成了普通類了。關(guān)于字符串類型饺蚊,主要是蘋果在編譯期做了一些優(yōu)化萍诱,讓它的特性跟普通變量有點類似,在這里就不說太多了污呼,以免給大家造成困惑裕坊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市燕酷,隨后出現(xiàn)的幾起案子籍凝,更是在濱河造成了極大的恐慌,老刑警劉巖苗缩,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饵蒂,死亡現(xiàn)場離奇詭異,居然都是意外死亡酱讶,警方通過查閱死者的電腦和手機退盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泻肯,“玉大人渊迁,你說我怎么就攤上這事∪砻猓” “怎么了宫纬?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膏萧。 經(jīng)常有香客問我漓骚,道長,這世上最難降的妖魔是什么榛泛? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任蝌蹂,我火速辦了婚禮,結(jié)果婚禮上曹锨,老公的妹妹穿的比我還像新娘孤个。我一直安慰自己,他們只是感情好沛简,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布齐鲤。 她就那樣靜靜地躺著斥废,像睡著了一般。 火紅的嫁衣襯著肌膚如雪给郊。 梳的紋絲不亂的頭發(fā)上牡肉,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音淆九,去河邊找鬼统锤。 笑死,一個胖子當著我的面吹牛炭庙,可吹牛的內(nèi)容都是我干的饲窿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焕蹄,長吁一口氣:“原來是場噩夢啊……” “哼逾雄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腻脏,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘲驾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迹卢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡徒仓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年腐碱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉弛。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡症见,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殃饿,到底是詐尸還是另有隱情谋作,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布乎芳,位于F島的核電站遵蚜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奈惑。R本人自食惡果不足惜吭净,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肴甸。 院中可真熱鬧寂殉,春花似錦、人聲如沸原在。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至村怪,卻和暖如春秽浇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背实愚。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工兼呵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腊敲。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓击喂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碰辅。 傳聞我的和親對象是個殘疾皇子懂昂,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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