OC篇


此處的屬性非成員變量,只是聲明瞭setter和getter方法

多個分類有同一個實例方法時最後編譯的分類方法生效,分類合併會覆蓋


通過關聯對象可以給分類添加“成員變量”







KVC打破了面對對象的編程思想

屬性關鍵字

atomic只保證了屬性的賦值和獲取的線程安全,比如對可變數組的增刪改是不能保證線程安全的,不能保證數據的安全性,只能保證拿到數據的完整性(即能取到值)

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

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

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

copy:
會在內存裏拷貝一份對象,兩個指針指向不同的內存地址。一般用來修飾NSString等有對應可變類型的對象,因爲他們有可能和對應的可變類型(NSMutableString)之間進行賦值操作,爲確保對象中的字符串不被修改 ,應該在設置屬性是拷貝一份。而若用strong修飾,如果對象在外部被修改了,會影響到屬性。
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;

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