在前面的學(xué)習(xí)中,出現(xiàn)的(nonatomic,copy)可能給初學(xué)者帶來(lái)了很大的困惑饵逐,為什么要對(duì)屬性進(jìn)行多方面的設(shè)置括眠,這樣寫有什么好處?下面我們來(lái)了解一下倍权。
首先要說(shuō)明的是掷豺,在@property對(duì)類中屬性進(jìn)行聲明時(shí),我們通常會(huì)對(duì)所聲明的屬性進(jìn)行一些設(shè)置薄声,例如:nonatomic当船、copy、strong奸柬、assign生年、weak婴程、readwrite
廓奕、readonly等。
如果@property后不對(duì)屬性進(jìn)行設(shè)置档叔,該屬性同樣有它的默認(rèn)的一些設(shè)置桌粉。下面向大家介紹一下幾種屬性的用法以及默認(rèn)的情況:
nonatomic:原名:非原子性,它涉及到多線程的相關(guān)知識(shí)衙四。在這里我們只需要知道有nonatomic聲明的屬性铃肯,任何人任何地點(diǎn)任何時(shí)間都可以調(diào)用它,所以它的缺點(diǎn)就是不安全传蹈,而優(yōu)點(diǎn)就是效率高押逼,訪問(wèn)速度快。
atomic(默認(rèn)):原子性惦界。和nonatomic正好相反挑格,他對(duì)屬性的訪問(wèn)進(jìn)行了限制,保護(hù)了聲明屬性的安全沾歪,缺點(diǎn)就是:訪問(wèn)效率低漂彤,速度慢。
copy:一般使用于字符串灾搏,它的特點(diǎn)如同它的中文翻譯挫望,對(duì)屬性進(jìn)行內(nèi)容的賦值,將內(nèi)容另外拷貝一份狂窑,保存在一個(gè)單獨(dú)的存儲(chǔ)空間中媳板。
strong:叫做:強(qiáng)引用。weak:弱引用
為了區(qū)分strong和weak以及copy之間的關(guān)系泉哈,我們來(lái)舉一個(gè)生活中的例子:我們應(yīng)該都放過(guò)風(fēng)箏(如果不知道什么是風(fēng)箏蛉幸,你的童年太悲慘了)到旦,在放風(fēng)箏的時(shí)候我們手中必須有一根線牽引著風(fēng)箏。
strong就代表你手中的線(一支風(fēng)箏上可能有很多根線巨缘,也就是說(shuō)可能有多個(gè)strong聲明的屬性用的同一塊內(nèi)存空間)添忘,只要還有一個(gè)人牽著風(fēng)箏,風(fēng)箏就不回飛走若锁,用OC的話來(lái)說(shuō)就是搁骑,只要還有一個(gè)用strong聲明的屬性不被銷毀,納悶這塊內(nèi)存中的數(shù)據(jù)就不回丟失又固,該內(nèi)存空間就不回釋放仲器。
而對(duì)于weak來(lái)說(shuō),就相當(dāng)于旁邊看放風(fēng)箏的人仰冠,他們只能用手指著你手里的風(fēng)箏乏冀,大喊著“風(fēng)箏風(fēng)箏”,他們只能和你一起欣賞風(fēng)箏洋只,而對(duì)于是不是繼續(xù)放風(fēng)箏的決定權(quán)在你辆沦,如果你不在放風(fēng)箏了,那他們也只能“各回各家识虚,各找各媽”肢扯。用OC的語(yǔ)言來(lái)表達(dá),就是說(shuō)用weak聲明的屬性雖然可以也可以訪問(wèn)內(nèi)存担锤,但是要在這塊內(nèi)存沒(méi)有釋放之前蔚晨,一旦這塊內(nèi)存被釋放之后,weak聲明的屬性將失去作用肛循。
對(duì)于copy來(lái)說(shuō)铭腕,是最幸福的一件事了,雖然你放著風(fēng)箏被我看見(jiàn)了多糠,我也想放累舷,而且我也不差錢,我就買了一支一模一樣的風(fēng)箏和你一起放熬丧。你收起風(fēng)箏不放了笋粟,我還可以放,有錢就是這么任性析蝴。從OC的角度解釋copy害捕,就是說(shuō)帶有copy聲明的屬性當(dāng)指向一塊內(nèi)存空間時(shí),它會(huì)完整的拷貝一份闷畸,然后用他自己的那一份尝盼,和被拷貝的內(nèi)存空間沒(méi)關(guān)系。
assign我認(rèn)為是其中最簡(jiǎn)單的佑菩,它應(yīng)用于OC的基礎(chǔ)數(shù)據(jù)類型和C語(yǔ)言中的基本數(shù)據(jù)類型(int,float,double,char)
readwrite:是一種默認(rèn)屬性盾沫,它代表這個(gè)屬性即可以讀裁赠,也可以寫(這個(gè)屬性既有set方法,又有g(shù)et方法)
readonly:和readwrite不同赴精,它代表這個(gè)屬性只能讀佩捞,不能進(jìn)行寫操作(只有g(shù)et方法,沒(méi)有set方法)
getter=<#method#>:在聲明的這個(gè)屬性可讀的前提下蕾哟,使用這個(gè)設(shè)置可以更改屬性的get方法名一忱,自己起一個(gè)。
setter=<#method#>:同get方法類似谭确,在聲明的屬性可寫的前提下帘营,使用這個(gè)設(shè)置可以設(shè)定這個(gè)屬性的set方法。
在@property的屬性中逐哈,以上幾個(gè)屬性用處最多芬迄,實(shí)際開(kāi)發(fā)過(guò)程中基本上都能囊括。
對(duì)于以上的幾個(gè)屬性昂秃,如果你覺(jué)的自己雖然知道它的功能是什么禀梳,但是具體使用過(guò)程中總是很矛盾到底用哪個(gè),下面幫大家總結(jié)一下:
對(duì)于基本數(shù)據(jù)類型械蹋,例如int出皇,double,float哗戈,char,還有OC語(yǔ)言中的BOOL以及NSInteger來(lái)說(shuō)荷科,都用assign唯咬。
對(duì)于OC中特有的字符串類型(NSString)來(lái)說(shuō),最常用的是copy畏浆。
對(duì)于OC中大量的類對(duì)象胆胰,一般用strong。
在后面我們會(huì)提到協(xié)議刻获,在涉及到協(xié)議中的delegate時(shí)蜀涨,我們會(huì)用weak。
對(duì)于前面提到的默認(rèn)屬性蝎毡,可以不寫厚柳,但是如果不是默認(rèn)屬性,就要寫明你的意圖沐兵。
對(duì)于原子性和非原子性别垮,如果不涉及到線程的情況下,為了運(yùn)行效率的提高扎谎,一般寫上非原子性碳想。
在默認(rèn)情況下烧董,由于每個(gè)屬性都是可讀可寫的,所以我們自已自定義屬性的set和get方法胧奔。
在某些特殊情況下逊移,如果該屬性已經(jīng)設(shè)置為可讀了,那就不要在用getter這個(gè)屬性龙填,因?yàn)槁暶髁艘灿貌涣嗣螅襒code會(huì)給你提示,set也是一樣觅够。