iOS開發(fā)中@property的屬性weak nonatomic strong readonly等介紹

@property與@synthesize是成對出現(xiàn)的,可以自動生成某個類成員變量的存取方法爱谁。在Xcode4.5以及以后的版本,@synthesize可以省略。

1.atomic與nonatomic
atomic:默認是有該屬性的锯七,這個屬性是為了保證程序在多線程情況,編譯器會自動生成一些互斥加鎖代碼誉己,避免該變量的讀寫不同步問題眉尸。
nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性巫延,這樣會讓編譯器少生成一些互斥加鎖代碼效五,可以提高效率。

2.readwrite與readonly
readwrite:這個屬性是默認的情況炉峰,會自動為你生成存取器畏妖。
readonly:只生成getter不會有setter方法。
readwrite疼阔、readonly這兩個屬性的真正價值戒劫,不是提供成員變量訪問接口,而是控制成員變量的訪問權(quán)限婆廊。

3.strong與weak
strong:強引用迅细,也是我們通常說的引用,其存亡直接決定了所指向?qū)ο蟮拇嫱鎏粤凇H绻淮嬖谥赶蛞粋€對象的引用茵典,并且此對象不再顯示在列表中,則此對象會被從內(nèi)存中釋放宾舅。
weak:弱引用统阿,不決定對象的存亡彩倚。即使一個對象被持有無數(shù)個弱引用,只要沒有強引用指向它扶平,那么還是會被清除帆离。
strong與retain功能相似;weak與assign相似结澄,只是當對象消失后weak會自動把指針變?yōu)閚il;

4.assign哥谷、copy、retain
assign:默認類型麻献,setter方法直接賦值们妥,不進行任何retain操作,不改變引用計數(shù)赎瑰。一般用來處理基本數(shù)據(jù)類型王悍。
retain:釋放舊的對象(release),將舊對象的值賦給新對象餐曼,再令新對象引用計數(shù)為1压储。我理解為指針的拷貝,拷貝一份原來的指針源譬,釋放原來指針指向的對象的內(nèi)容集惋,再令指針指向新的對象內(nèi)容。
copy:與retain處理流程一樣踩娘,先對舊值release刮刑,再copy出新的對象,retainCount為1.為了減少對上下文的依賴而引入的機 制养渴。我理解為內(nèi)容的拷貝雷绢,向內(nèi)存申請一塊空間,把原來的對象內(nèi)容賦給它理卑,令其引用計數(shù)為1翘紊。對copy屬性要特別注意:被定義有copy屬性的對象必須要 符合NSCopying協(xié)議,必須實現(xiàn)- (id)copyWithZone:(NSZone *)zone方法藐唠。
也可以直接使用:
使用assign: 對基礎數(shù)據(jù)類型 (NSInteger帆疟,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等等)
使用copy: 對NSString
使用retain: 對其他NSObject和其子類

5.getter setter
getter:是用來指定get方法的方法名
setter:是用來指定set訪求的方法名
在@property的屬性中,如果這個屬性是一個BOOL值宇立,通常我們可以用getter來定義一個自己喜歡的名字踪宠,例如:
@property (nonatomic, assign, getter=isValue) boolean value;
@property (nonatomic, assign, setter=setIsValue) boolean value;

一,retain, copy, assign區(qū)別

假設你用malloc分配了一塊內(nèi)存,并且把它的地址賦值給了指針a妈嘹,后來你希望指針b也共享這塊內(nèi)存柳琢,于是你又把a賦值給(assign)了b。此時a
和b指向同一塊內(nèi)存,請問當a不再需要這塊內(nèi)存染厅,能否直接釋放它痘绎?答案是否定的,因為a并不知道b是否還在使用這塊內(nèi)存肖粮,如果a釋放了,那么b在使用這塊
內(nèi)存的時候會引起程序crash掉尔苦。

了解到1中assign的問題涩馆,那么如何解決?最簡單的一個方法就是使用引用計數(shù)(reference
counting)允坚,還是上面的那個例子魂那,我們給那塊內(nèi)存設一個引用計數(shù),當內(nèi)存被分配并且賦值給a時稠项,引用計數(shù)是1涯雅。當把a賦值給b時引用計數(shù)增加到
2。這時如果a不再使用這塊內(nèi)存展运,它只需要把引用計數(shù)減1活逆,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時也把引用計數(shù)減1拗胜。當引用計數(shù)變?yōu)?的時候蔗候,
代表該內(nèi)存不再被任何指針所引用,系統(tǒng)可以把它直接釋放掉埂软。

  1. 上面兩點其實就是assign和retain的區(qū)別锈遥,assign就是直接賦值,從而可能引起1中的問題勘畔,當數(shù)據(jù)為int, float等原生類型時所灸,可以使用assign。retain就如2中所述炫七,使用了引用計數(shù)爬立,retain引起引用計數(shù)加1, release引起引用計數(shù)減1,當引用計數(shù)為0時诉字,dealloc函數(shù)被調(diào)用懦尝,內(nèi)存被回收。

  2. copy是在你不希望a和b共享一塊內(nèi)存時會使用到壤圃。a和b各自有自己的內(nèi)存陵霉。

  3. atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下伍绳,原子操作是必要的踊挠,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:

if (property != newValue) {
[property release];
property = [newValue retain];
}

二,深入理解一下(包括autorelease)1. retain之后count加一效床。alloc之后count就是1睹酌,release就會調(diào)用dealloc銷毀這個對象。
如果 retain剩檀,需要release兩次憋沿。通常在method中把參數(shù)賦給成員變量時需要retain。
例如:
ClassA有 setName這個方法:
-(void)setName:(ClassName *) inputName
{
name = inputName;
[name retain]; //此處retian沪猴,等同于[inputName retain],count等于2
}
調(diào)用時:
ClassName *myName = [[ClassName alloc] init];
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1辐啄,在ClassA的dealloc中release name才能真正釋放內(nèi)存。

  1. autorelease 更加tricky运嗜,而且很容易被它的名字迷惑壶辜。我在這里要強調(diào)一下:autorelease不是garbage collection,完全不同于Java或者.Net中的GC担租。
    autorelease和作用域沒有任何關系砸民!
    autorelease 原理:
    a.先建立一個autorelease pool
    b.對象從這個autorelease pool里面生成。
    c.對象生成 之后調(diào)用autorelease函數(shù)奋救,這個函數(shù)的作用僅僅是在autorelease pool中做個標記岭参,讓pool記得將來release一下這個對象。
    d.程序結(jié)束時菠镇,pool本身也需要rerlease, 此時pool會把每一個標記為autorelease的對象release一次冗荸。如果某個對象此時retain count大于1,這個對象還是沒有被銷毀利耍。
    上面這個例子應該這樣寫:
    ClassName *myName = [[[ClassName alloc] init] autorelease];//標記為autorelease
    [classA setName:myName]; //retain count == 2
    [myName release]; //retain count==1蚌本,注意,在ClassA的dealloc中不能release name隘梨,否則release pool時會release這個retain count為0的對象程癌,這是不對的。

記住一點:如果這個對象是你alloc或者new出來的轴猎,你就需要調(diào)用release嵌莉。如果使用autorelease,那么僅在發(fā)生過retain的時候release一次(讓retain count始終為1)捻脖。

3 xcode 中的新標記 strong weak
strong 用來修飾強引用的屬性锐峭;對應以前retain

weak 用來修飾弱引用的屬性;對應以前的assign

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末可婶,一起剝皮案震驚了整個濱河市沿癞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矛渴,老刑警劉巖椎扬,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚕涤,警方通過查閱死者的電腦和手機筐赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揖铜,“玉大人茴丰,你說我怎么就攤上這事÷唬” “怎么了较沪?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長失仁。 經(jīng)常有香客問我,道長们何,這世上最難降的妖魔是什么萄焦? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮冤竹,結(jié)果婚禮上拂封,老公的妹妹穿的比我還像新娘。我一直安慰自己鹦蠕,他們只是感情好冒签,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钟病,像睡著了一般萧恕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肠阱,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天票唆,我揣著相機與錄音,去河邊找鬼屹徘。 笑死走趋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的噪伊。 我是一名探鬼主播簿煌,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鉴吹!你這毒婦竟也來了姨伟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拙寡,失蹤者是張志新(化名)和其女友劉穎授滓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡般堆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年在孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮摔。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡私沮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出和橙,到底是詐尸還是另有隱情仔燕,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布魔招,位于F島的核電站晰搀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏办斑。R本人自食惡果不足惜外恕,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乡翅。 院中可真熱鬧鳞疲,春花似錦、人聲如沸蠕蚜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靶累。三九已至腺毫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尺铣,已是汗流浹背拴曲。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凛忿,地道東北人澈灼。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像店溢,于是被迫代替她去往敵國和親叁熔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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