iOS開發(fā)中@property后面可以跟哪些修飾符以及我對ARC的理解

2016.5.30更新:

經(jīng)評論區(qū)提醒:
其實還有兩個特性:為空性nullability和自定義getter,setter方法名屬性。
這兩個特性比較簡單也不太常用,所以就不納入文章。

2016.6.3更新:

今天在《iOS編程》書中看到,block對象的屬性聲明應該為copy(本文之前的觀點是weak)更為準確。因為Block對象是在棧中創(chuàng)建的,而其他對象是在堆中創(chuàng)建的。這意味著,即使應用針對新創(chuàng)建的Block對象保留了強引用類型的指針,一旦創(chuàng)建該對象的方法返回,那么與方法內部的其他局部變量相同,新創(chuàng)建的Block對象也會被立即釋放。為了在聲明Block對象的方法返回后仍然保留該對象,必須向其發(fā)送copy消息??截惸硞€Block對象時,應用會在堆中創(chuàng)建該對象的備份。這樣,即使應用釋放了當前方法的棧,堆中的Block對象也不會被釋放。

2016.6.3更新:

本文之前指出IBOutlet屬性應該設為weak,但是在WWDC2015上Apple官方推薦IBOutlet屬性應該設為strong,除非需要避免引用循環(huán)的屬性才設置為weak。在stackoverflow上有關于這個問題的討論,我覺得最佳實踐應該是頂層視圖的IBOutlet屬性使用strong,子視圖的使用weak。(《iOS編程》中也是這個觀點)
詳見:http://stackoverflow.com/questions/7678469/should-iboutlets-be-strong-or-weak-under-arc


最近在找實習工作,幾乎每次面試都會被問及@property后的三個關鍵字。網(wǎng)上不是說面試一個人的iOS開發(fā)水平,問個property就大概知道了。所以今天花了一些時間總結了一下,這些內容都來自于我看過的書以及在網(wǎng)上查閱的一些資料。

在iOS開發(fā)中,任何一個屬性都有三個特性(@property后面可以跟三個關鍵字),每個特性都有多種不同的可選類型。

多線程特性

默認:atomic

  • atomic:原子的。表示線程安全。使用atomic的目的是為了確保其他線程不在同一時間內訪問相同的資源。(編譯器會自動生成互斥加鎖的代碼,避免變量的讀寫不同步)但往往即使聲明了atomic屬性也不能一定保證線程安全,而且這種機制是耗費系統(tǒng)資源的。(所以一般都聲明為nonatomic屬性)

  • nonatomic:非原子的。表示非線程安全??梢栽诓煌牡胤阶x取和設置屬性的值。(可能會導致讀寫不同步)編譯器會少生成一些互斥加鎖的代碼,可以提高效率。

總結:涉及到多線程的時候,使用atomic,保證安全。不涉及多線程,使用nonatomic,效率更高。

原子操作:是指不會被線程調度機制打斷的操作。原子操作一旦開始,就要一直運行到結束,不會被打斷。

讀寫特性

默認:readwrite

  • readwrite:編譯器會為屬性生成get方法和set方法
  • readonly:編譯器只生成get方法

readonly一般用于設置內部數(shù)據(jù)的訪問權限:某個對象中有一種可修改的數(shù)據(jù),但是除該對象外,其他數(shù)據(jù)只能訪問該數(shù)據(jù)而不能修改它。這時我們就可以為該數(shù)據(jù)另外設置一個readonly屬性僅供外界讀取,修改則在該對象中修改readwrite屬性的數(shù)據(jù)。(這也是一種常用的設計模式)

內存管理特性(我對ARC的理解)

默認:strong
iOS5后使用ARC來管理內存。ARC的原則:只要某個對象被任一strong指針指向,那么他將不會被銷毀。當對象沒有被任何strong指針指向,那么該對象將被銷毀。

  • strong:使用strong屬性會引起引用計數(shù)加1。是指針拷貝(淺拷貝),不會拷貝內容。當有某個strong指針指向某個對象時,該對象不會被銷毀,只有當strong指針設定了新的值,或是超出了作用范圍時,該strong指針就不再持有該對象,倘若該對象不被其他strong指針持有,該對象就會被釋放。

  • weak:表示一種“非擁有關系”。為這種屬性設置新值時,設置方法既不釋放舊值,也不保留新值,不會使引用計數(shù)加1。當所指對象被銷毀時,指針會自動被置為nil,防止野指針。
    【適用范圍:delegate,IBOutlet屬性】
    weak指針還可以解決強引用循環(huán)(strong reference cycle/retain cycle):當兩個或兩個以上對象之間互相強引用時,無法通過ARC來釋放對象,可能會導致內存泄漏。解決辦法是將其中一個指針改為weak。具體改哪一個,可以為存在強引用循環(huán)的對象決定父子關系。父對象應該使用具有強引用特性的指針指向子對象,子對象應該使用具有弱引用特性的指針指向父對象。

  • copy:先copy一個相同對象,再創(chuàng)建一個strong指針。(深拷貝,會拷貝內容)
    【當某對象的類具有可修改的子類時,應該將屬性設為copy。例如:NSString,NSArray,NSDictionary
    這樣做的原因是:如果屬性指向的對象的類具有可修改的子類,那個該屬性可能會指向可修改的子類對象,同時該子類對象可能會被其他擁有者修改。因此,最好先復制該對象,然后再將屬性指向復制后的對象。(編寫具有“防御性”的代碼)

@property (nonatomic, copy) NSString *string_1;
@property (nonatomic, strong) NSMutableString *string_2;
self.string_2 = [[NSMutableString alloc] init];
self.string_1 = self.string_2;

上述代碼中string_2可能會被改變,但是string_1是不可變類型的?!?br> 擴展:這個寫法會出什么問題:

@property (nonatomic,copy) NSMutableArray *array;

添加,刪除,修改數(shù)組內的元素的時候,程序會因為找不到對應的方法(unrecognised selector)而崩潰.因為 copy 就是復制一個不可變 NSArray的對象。

  • unsafe_unretained:(不安全不引用)用于非對象屬性(即:基本數(shù)據(jù)類型),這類屬性不需要做內存管理,它表示存取方法會直接為實例變量賦值?!綧RC時期使用assign
    【unsafe是相對于weak而言的。unsafed_unretained類型的指針指向的對象被銷毀時,指針不會自動設置為nil,而是成為空指針,因此不安全。但是當處理非對象屬性時是不會出現(xiàn)空指針問題的】
    【unretained是指不會引起引用計數(shù)加1】

補充:

MRC時期的關鍵字:

  • assign(賦值):表示簡單的直接賦值操作。
    • 用于基本數(shù)據(jù)類型(NSInteger,CGFloat等)和C數(shù)據(jù)類型(int,floatdouble等)
    • 用于id類型。(比如delegate屬性,使用weak可以避免出現(xiàn)強引用循環(huán))【當id類型使用assign時,對象被銷毀,指針不會被置空,可能會引起空指針】
      在引入ARC后,assign的第一個功能已經(jīng)被unsafed_unretained取代,第二個功能被weak取代
  • retain(持有):先release原來的值,再retain新值(引用計數(shù)會自動加1)。
-(void)setA:(ClassA *)a{
    if(_a!=a){
        [_a release];
        _a=[a retain];
    }
}

在引入ARC后,使用strong代替retain

當然以上只是我目前的理解,我相信以后肯定會有更深的理解。所以我會隨時更新我的新看法的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1.1 什么是自動引用計數(shù) 概念:在 LLVM 編譯器中設置 ARC(Automaitc Reference Co...
    __silhouette閱讀 5,462評論 1 17
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,241評論 0 7
  • Cocoa內存管理機制 (1)當你使用new、alloc、copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1.當...
    John_LS閱讀 2,862評論 0 6
  • 1 是否有寫文章時可供征引的資源庫?如果有,是哪一方面?已經(jīng)讀過了哪些書籍? 如果資源庫不局限于書籍的話,那它倒是...
    一個文字狗閱讀 322評論 4 2
  • 今日,半天的時間到中國人大文化大廈聽了人類學論壇,收獲及感觸如下:1.禮物及互惠是文化人類學的基本而重要的概念,從...
    暮山紫閱讀 226評論 0 0

友情鏈接更多精彩內容