readonly、retain、copy、assign……

readonly:表示這個屬性是隻讀的,只生成getter方法,不會生成setter方法.
readwrite:設置可供訪問級別,同時生成get方法和set方法的聲明和實現
retain:是說明該屬性在賦值的時候,set方法的實現是release舊值,然後再retain新值給屬性,引用再加1,用於OC對象類型
nonatomic:非原子性訪問,不加同步,多線程併發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。set方法的實現不加鎖(比atomic性能高)。

copy:會在內存裏拷貝一份對象,兩個指針指向不同的內存地址。一般用來修飾NSString等有對應可變類型的對象,因爲他們有可能和對應的可變類型(NSMutableString)之間進行賦值操作,爲確保對象中的字符串不被修改 ,應該在設置屬性是拷貝一份。而若用strong修飾,如果對象在外部被修改了,會影響到屬性。
淺Copy:其實就是對指針的複製,複製後便多了一個指向這塊內存的指針,內存還是共用的一個。
深Copy:是對內存的複製,複製後兩個內存是完全不同的,也就是說兩個對象指針分別指向了不同的內存。

weak:修飾Object類型,修飾的對象在釋放後,指針地址會被置爲nil,是一種弱引用。在ARC環境下,爲避免循環引用,往往會把delegate屬性用weak修飾;在MRC下使用assign修飾。weak和strong不同的是:當一個對象不再有strong類型的指針指向它的時候,它就會被釋放,即使還有weak型指針指向它,那麼這些weak型指針也將被清除。

assign:簡單賦值,一般用於對基本數據類型的賦值,不更改引用計數,也可以用來修飾對象,但是,被assign修飾的對象在釋放後,指針的地址還是存在的,也就是說指針並沒有被置爲nil,成爲野指針。如果後續在分配對象到堆上的某塊內存時,正好分到這塊地址,程序就會crash。之所以可以修飾基本數據類型,因爲基本數據類型一般分配在棧上,棧的內存會由系統自動處理,不會造成野指針。

ARC下的strong等同於MRC下的retain都會把對象引用計數加1。

block屬性需要用copy來修飾:
在MRC下,block在創建的時候,它的內存是分配在棧(stack)上的,而不是在堆(heap)上,可能被隨時回收。他本身的作於域是屬於創建時候的作用域,一旦在創建時候的作用域外面調用block將導致程序崩潰。通過copy可以把block拷貝(copy)到堆,保證block的聲明域外使用。在ARC下寫不寫都行,編譯器會自動對block進行copy操作。

block與weak的區別
block:在ARC和MRC下都可用,可修飾對象,也可以修飾基本數據類型。
block對象可以在block被重新賦值,weak不可以。
weak:只在ARC中使用,只能修飾對象,不能修飾基本數據類型(int、bool)。
同時,在ARC下,要避免block出現循環引用,經常會:weak typedof(self) weakSelf = self;

assign與weak
兩者都是弱引用,assign通常用於普通類型屬性(如int,NSInteger),還有代理屬性的修飾,基本上來說兩者是可以通用的。
只是後者比前者多了一個功能,後者會在引用的對象被釋放的時候將該屬性置爲nil,而前者依然會指向原來的位置,這樣就會變成野指針。在oc中你給你一個nil對象發送消息不會crash,但是給一個對象發送他不能解析的消息是會crash的,所以總的來說weak要比assign安全一些。
像delegate屬性建議用weak修飾而不是assign。

retain和strong
他倆都是強引用,除了某些情況下不一樣,其他的時候也是可以通用的。
在修飾block屬性的時候,相信大家都知道要用copy吧,因爲如果不copy的話,block是存放在棧連裏面的,他的生命週期會隨着函數的結束而出棧的,copy之後會放在堆裏面。
strong在修飾block的時候就相當於copy,而retain修飾block的時候就相當於assign,這樣block會出現提前被釋放掉的危險。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章