把OC中容易忘記、比較關鍵、面試常問、工作常用的一些知識點記錄下來
property屬性的參數:
- weak:弱引用,
- strong:強引用,一般對象適用strong,對對象持有,自身銷毀時,所持有對象
- retain: 保留對象 就在setter 和 getter方法中加入一些內存管理的代碼,當屬性是一個普通OC對象的時候,使用retain
- assign: 直接賦值,不生成內存管理代碼,屬性是一個基本數據類型的時候,使用assign
- copy: copy 復制對象副本,NSString 使用copy
- atomic: 原子(默認),會生成線程安全的代碼,速度慢,在調用setter方法時進行加鎖操作
- nonatomic: 非原子,不會生成線程安全的代碼,速度快
- readonly:只有setter方法,無getter方法
- readwrite:可讀可寫,生成getter 與 setter方法
id類型:
萬能型對象指針類型,動態類型,缺點是不會在編譯時檢查錯誤,優點是提供對象的多態特性
instancetype類型:
相對于id類型,它會自動進行類型檢查,如果不一致就會報一個警告,instancetype 只可以作為返回類型
內存管理:
- 棧: 局部變量:定義在方法或函數內部變量,由系統管理
- 堆:動態存儲區,由程序員進行管理
- 野指針:只初始化了沒有賦值或者指向的指針,或者對象被提前釋放了的指針,訪問野指針會造成程序崩潰
- 空指針:指向nil 的指針
手動管理內存MRC:
誰調用new,alloc,retain,copy,multableCopy初始化,誰就要調用對應的release或autorelease;需要一個對象時就要retain,不需要一個對象了就要release
- 循環引用: 為避免循環引用,有一個對象或者數據要使用assign參數,必須有一方是弱引用
- autorelease: 自動釋放池,延長對象生命周期,在自動釋放池銷毀時會對所有池中的的對象進行release操作
- release:銷毀對象
自動引用計數ARC:
自動管理內存,除了使用alloc,copy,retain時,要自己使用release和autorelease釋放對象,其他都不需要你來管理內存
- 強指針:默認所有的指針都是強指針
只要是有強指針指向一個對象,那么這個對象就不會被釋放
只要是沒有強指針指向一個對象,那么這個對象就被立即回收
_strong 強指針標示,但是默認所有指針都是強指針,所以他沒有用 - 弱指針:弱指針指向的對象不影響對象回收
注意:不要用弱指針指向一個剛剛創建出來的對象
cotogory分類:
擴展已有類的功能,添加私有的成員變量,屬性和方法.
分類中屬性不能生成setter和getter方法的實現方法,只有聲明方法,也不會生成實現成員變量,不能添加和已有類相同的方法名
SEL:
一種數據類型,代表方法簽名,通過SEL可以找到對象的對應的方法
使用關鍵字:@selector(方法名稱)生成 SEL,target: action: 方法用到了
block:
代碼塊,一種用來封裝代碼的數據類型,可以使用在方法內部
作為函數參數類型的格式:返回值類型(^)(形參列表)
在block 中可以訪問局部變量的
默認在block內部不能修改局部變量的值
如果想修改局部變量的值,要再定義這個變量的時候,在前面加上__blockblock需要使用copy屬性:block在棧里面的,block內部要使用本地變量,那么必須在堆里面操作,copy是在堆內的。
protocol: 協議:
可以聲明協議類型變量,協議分為required方法和optional方法,一個類可以同時遵循多個協議
委托代理機制:
在委托者中聲明一個協議,然后創建一個delegate屬性,被委托者遵守委托者的協議,然后實現委托者的協議,還要讓被委托者成為委托者的代理
深淺復制:
- 淺復制: 不會產生一個新的對象,只拷貝對象指針
- 深復制: 會產生一個新的對象,完全拷貝,復制屬性
對于不可變的對象使用copy,是淺復制,使用mutablecopy是深復制
對于可變對象使用copy或者mutablecopy都是深復制