.@property
1>readwrite,readonly,assign,retain,copy,nonatomic屬性的作用
@property是一個(gè)屬性訪(fǎng)問(wèn)聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:
1.1> getter setter
getter=getterName,setter=setterName,設(shè)置setter與getter的方法名
1.2> weak assign strong copy
assign? 用于非指針變量。用于基礎(chǔ)數(shù)據(jù)類(lèi)型 (例如NSInteger)和C數(shù)據(jù)類(lèi)型(int, float, double, char, 等),另外還有id,其setter方法直接賦值,不進(jìn)行任何retain操作
weak? ? 用于指針變量,比assign多了一個(gè)功能,當(dāng)對(duì)象消失后自動(dòng)把指針變成nil,由于消息發(fā)送給空對(duì)象表示無(wú)操作,這樣有效的避免了崩潰(野指針),為了解決原類(lèi)型與循環(huán)引用問(wèn)題
strong? 用于指針變量,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值
copy? ? 用于指針變量,setter方法進(jìn)行copy操作,與retain處理流程一樣,先舊值release,再copy出新的對(duì)象,retainCount為1。這是為了減少對(duì)上下文的依賴(lài)而引入的機(jī)制。copy是在你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到。a和b各自有自己的內(nèi)存。
1.3> readwrite,readonly,設(shè)置可供訪(fǎng)問(wèn)級(jí)別
1.4> nonatomic,非原子性訪(fǎng)問(wèn),不加同步,多線(xiàn)程并發(fā)訪(fǎng)問(wèn)會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪(fǎng)問(wèn)方法都為原子型事務(wù)訪(fǎng)問(wèn)。所以約定俗成只在主線(xiàn)程更新UI,防止多線(xiàn)程設(shè)置UI屬性,出現(xiàn)資源搶奪現(xiàn)象
2> 如何避免循環(huán)引用
兩個(gè)對(duì)象相互強(qiáng)引用,都無(wú)法release,解決辦法為一個(gè)使用strong,一個(gè)使用assign(weak)
3> delegate的屬性為什么使用assign/weak
避免出現(xiàn)循環(huán)引用,場(chǎng)景如UITableViewController強(qiáng)引用視圖UITableView,而該視圖的代理又是控制器,為避免循環(huán)引用,讓delegate為弱引用
weak 和 assign?
weak和assign都是引用計(jì)算不變,兩個(gè)的差別在于,weak用于object type,就是指針類(lèi)型,而assign用于簡(jiǎn)單的數(shù)據(jù)類(lèi)型,如int BOOL 等。
assign看起來(lái)跟weak一樣,其實(shí)不能混用的,assign的變量在釋放后并不設(shè)置為nil(和weak不同),當(dāng)你再去引用時(shí)候就會(huì)發(fā)生錯(cuò)誤,崩潰,EXC_BAD_ACCESS.