iOS開發(fā)---屬性關(guān)鍵字詳解

iOS開發(fā)—屬性關(guān)鍵字詳解

@Property

什么是屬性榜轿?

  • 屬性(property)Objective-C的一項特性短条,用于封裝對象中的數(shù)據(jù)剑辫。這一特性可以令編譯器自動編寫與屬性相關(guān)的存取方法阱飘,并且保存為各種實例變量摘昌。
  • 屬性的本質(zhì)是實例變量與存取方法的結(jié)合速妖。@property = ivar + getter + setter
    • 實現(xiàn)流程:
    • 每次增加一個屬性,系統(tǒng)都會在 ivar_list中添加一個成員變量的描述,在method_list 中增加settergetter 方法的描述聪黎,在 prop_list中增加一個屬性的描述罕容,計算該屬性在對象中的偏移量,然后給出 settergetter方法對應的實現(xiàn)。在 setter 方法中從偏移量的位置開始賦值,在 getter 方法中從偏移量開始取值,為了能夠讀取正確字節(jié)數(shù),系統(tǒng)對象偏移量的指針類型進行了類型強轉(zhuǎn)锦秒。

Property的默認設置

  • 基本數(shù)據(jù)類型:atomic, readwrite,assign
  • 對象類型:atomic, readwrite, strong

??:注意:考慮到代碼可讀性以及日常代碼修改頻率露泊,規(guī)范的編碼風格中關(guān)鍵詞的順序是:原子性、讀寫權(quán)限旅择、內(nèi)存管理語義惭笑、getter/getter。

關(guān)鍵字

關(guān)鍵字 解釋
atomic 原子性訪問
nonatomic 非原子性訪問生真,多線程并發(fā)訪問會提高性能
readwrite 此標記說明屬性會被當成讀寫的沉噩,這也是默認屬性
readonly 此標記說明屬性只可以讀,也就是不能設置汇歹,可以獲取
strong 打開ARC時才會使用屁擅,相當于retain
weak 打開ARC時才會使用,相當于assign产弹,可以把對應的指針變量置為nil
assign 不會使引用計數(shù)加1派歌,也就是直接賦值
unsafe_unretain 與weak類似,但是銷毀時不自動清空痰哨,容易形成野指針
copy 與strong類似胶果,設置方法會拷貝一份副本。一般用于修飾字符串和集合類的不可變版斤斧, block用copy修飾

詳解copy

  • copy語法的作用:

    • 產(chǎn)生副本
      • copy返回的是不可變的副本
      • mutableCopy返回的是可變的副本
    • 修改了副本并不會影響源對象早抠,修改了源對象,并不會影響副本撬讽。
  • copy使用場景:

    • NSString蕊连、NSArrayNSictionary 等等經(jīng)常使用copy 關(guān)鍵字,是因為他們有對應的可變類型:NSMutableString游昼、NSMutableArray甘苍、NSMutableDictionary.為確保對象中的屬性值不會無意間變動,應該在設置新屬性值時拷貝一份,保護其封裝性
    • block,也經(jīng)常使用 copy
      • 使用 copy 是從MRC 遺留下來的“傳統(tǒng)”,在MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).

      • ARC 中寫不寫都行:對于block 使用 copy還是 strong效果是一樣的,但是建議寫上 copy,因為這樣顯示告知調(diào)用者“編譯器會自動對 block 進行了 copy 操作.

  • 為什么用@property 聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用 copy 關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?

    • 因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本. 如果我們使用是 strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.
  • 如何讓自定義類可以用 copy 修飾符?如何重寫帶copy 關(guān)鍵字的 setter?

    • 若想令自己所寫的對象具有拷貝功能,則需實現(xiàn)NSCopying 協(xié)議烘豌。如果自定義的對象分為可變版本與不可變版本,那么就要同時實現(xiàn) NSCopyiogNSMutableCopying 協(xié)議,不過一般沒什么必要,實現(xiàn)NSCopying 協(xié)議就夠了
    - (id)copyWithZone:(NSZone *)zone {
        NSObject *copyObj = [[NSObject allocWithZone:zone] init];
        copyObj.name = self.name;
        return copyObj;
    }
    
    - (void)setName;(Mitchell*)name {
        _name = [name copy];
    }
    

atomic與nonatomic

  • 什么是原子性载庭?
    • 并發(fā)編程中確保其操作具備整體性,系統(tǒng)其它部分無法觀察到中間步驟廊佩,只能看到操作前后的結(jié)果
  • atomic:原子性的囚聚,編譯器會通過鎖定機制確保settergetter的完整性。
  • nonatomic:非原子性的标锄,不保證settergetter的完整性顽铸。
  • 區(qū)別:由于要保證操作完整,atomic速度比較慢料皇,線程相對安全跋破;nonatomic速度比較快簸淀,但是線程不安全瓶蝴。atomic也不是絕對的線程安全毒返,當多個線程同時調(diào)用settergetter時,就會導致獲取的值不一樣舷手。由于鎖定機制開銷較大拧簸,一般iOS開發(fā)中會使用nonatomic,而macOS中使用atomic通常不會有性能瓶頸男窟。
  • 如果對這塊不太了解盆赤,你可以看一下這篇文章atomic到底不安全在哪?

readwrite與readonly

  • 讀寫權(quán)限不寫時默認為 readwrite 歉眷。一般可在 .h 里寫成readonly牺六,只對外提供讀取,在 .m 的Extension中再設置為 readwrite 可進行寫入汗捡。
//.h文件
@interface MyClass : NSObject
@property (nonatomic, readonly, copy) NSString *name;
@end

//.m文件
@interface MyClass()
@property (nonatomic, readwrite, copy) NSString *name;
@end

比較strong與copy

  • 相同之處:是用于修飾表示擁有關(guān)系的對象淑际。
  • 不同之處:strong復制是多個指針指向同一個地址,而copy的復制是每次會在內(nèi)存中復制一份對象扇住,指針指向不同的地址春缕。
    • NSStringNSArray艘蹋、NSDictionary等不可變對象用copy修飾锄贼,因為有可能傳入一個可變的版本,此時能保證屬性值不會受外界影響女阀。
  • 注意??:若用strong修飾NSArray宅荤,當數(shù)組接收一個可變數(shù)組,可變數(shù)組若發(fā)生變化浸策,被修飾的屬性數(shù)組也會發(fā)生變化冯键,也就是說屬性值容易被篡改;若用copy修飾NSMutableArray的榛,當試圖修改屬性數(shù)組里的值時琼了,程序會崩潰,因為數(shù)組被復制成了一個不可變的版本夫晌。

比較assign雕薪、weak、unsafe_unretain

  • 相同之處:都不是強引用
  • 不同之處:weak引用的 OC 對象被銷毀時, 指針會被自動清空晓淀,不再指向銷毀的對象所袁,不會產(chǎn)生野指針錯誤unsafe_unretain引用的 OC 對象被銷毀時, 指針并不會被自動清空, 依然指向銷毀的對象凶掰,很容易產(chǎn)生野指針錯誤:EXC_BAD_ACCESS燥爷;assign修飾基本數(shù)據(jù)類型蜈亩,內(nèi)存在棧上由系統(tǒng)自動回收。

@synthesize 和 @dynamic

  • @property 有兩個對應的詞,一個是@synthesize,一個是@dynamic前翎。
    如果@synthesize@dynamic 都沒寫,那么默認的就是
    @syntheszie var = _var;

  • @synthesize 的語義是如果你沒有手動實現(xiàn) setter 方法和 getter 方法,那么編譯器會自動為你加上這兩個方法稚配。

  • @dynamic 告訴編譯器:屬性的settergetter 方法由用戶自己實現(xiàn),不自動生成。(當然對于 readonly 的屬性只需提供 getter 即可)
    假如一個屬性被聲明為

  • @dynamic var港华;然后你沒有提供@setter 方法和@getter 方法,編譯的時候沒問題,但是當程序運行到 instance.var = someVar,由于缺 setter方法會導致程序崩潰;
    或者當運行到 someVar = instance.var 時,由于缺getter 方法同樣會導致崩潰道川。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市立宜,隨后出現(xiàn)的幾起案子冒萄,更是在濱河造成了極大的恐慌,老刑警劉巖橙数,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尊流,死亡現(xiàn)場離奇詭異,居然都是意外死亡灯帮,警方通過查閱死者的電腦和手機崖技,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來施流,“玉大人响疚,你說我怎么就攤上這事〉纱祝” “怎么了忿晕?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長银受。 經(jīng)常有香客問我践盼,道長,這世上最難降的妖魔是什么宾巍? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任咕幻,我火速辦了婚禮,結(jié)果婚禮上顶霞,老公的妹妹穿的比我還像新娘肄程。我一直安慰自己,他們只是感情好选浑,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布蓝厌。 她就那樣靜靜地躺著,像睡著了一般古徒。 火紅的嫁衣襯著肌膚如雪拓提。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天隧膘,我揣著相機與錄音代态,去河邊找鬼寺惫。 笑死,一個胖子當著我的面吹牛蹦疑,可吹牛的內(nèi)容都是我干的西雀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼必尼,長吁一口氣:“原來是場噩夢啊……” “哼蒋搜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起判莉,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎育谬,沒想到半個月后券盅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡膛檀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年锰镀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咖刃。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡泳炉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚎杨,到底是詐尸還是另有隱情花鹅,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布枫浙,位于F島的核電站刨肃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箩帚。R本人自食惡果不足惜真友,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望紧帕。 院中可真熱鬧盔然,春花似錦、人聲如沸是嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叠纷。三九已至刻帚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涩嚣,已是汗流浹背崇众。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工掂僵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顷歌。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓锰蓬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眯漩。 傳聞我的和親對象是個殘疾皇子芹扭,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • 出題者簡介: 孫源(sunnyxx),目前就職于百度赦抖,負責百度知道 iOS 客戶端的開發(fā)工作舱卡,對技術(shù)喜歡刨根問底和...
    戈多_于勒閱讀 1,798評論 0 5
  • 親和國學文創(chuàng)園項目建設政府協(xié)調(diào)會 感謝云巖區(qū)委宣傳部文產(chǎn)辦牽頭組織[害羞][抱拳]
    文心訪藝閱讀 164評論 0 0
  • 幸福就是看家人的臉,不幸就是看人家的臉队萤!
    Ewalnut閱讀 157評論 0 0
  • 夜,你別太美 我怕留戀赵辕。 夜既绩,你別太長 我怕思念遭京。 夜褂删,你別太黑 我怕孤單。 夜笋鄙,你別太靜 我怕痛苦吸重。 夜互拾,你別太...
    一碗河撈面閱讀 403評論 1 2