iOS知識整理-OC特性

分類

分類的作用

分解體積龐大的類文件
為系統類添加方法
聲明私有方法
把Framework的私有方法公開

分類添加過程

在程序運行時候,runtime會把分類的實例方法等信息合并到類對象的實例方法列表中,會把分類的類方法合并到元類對象的類方法列表中(在原方法之前)。
以添加實例方法為例:
運行時候,會遍歷分類列表,拿到每一個分類的實例方法列表

分類能添加成員變量嗎?

不能。只能通過關聯對象(objc_setAssociatedObject)來模擬實現成員變量,但其實質是關聯內容,所有對象的關聯內容都放在同一個全局容器哈希表中:AssociationsHashMap,由AssociationsManager統一管理。

#關聯對象: 使用objc_setAssociatedObject函數可以給某個對象關聯其他的對象。
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
 
#獲取關聯的對象: 使用objc_getAssociatedObject函數可以通過鍵來取出某個對象的關聯對象。
id objc_getAssociatedObject(id object, const void *key)
 
#移除關聯的對象:使用objc_removeAssociatedObjects函數可以移除某個對象身上的所有關聯的對象。
void objc_removeAssociatedObjects(id object)

?
?
?

擴展

一般用擴展做什么?

聲明私有屬性,聲明方法(沒什么意義),聲明私有成員變量

擴展的特點

編譯時決議,只能以聲明的形式存在,多數情況下寄生在宿主類的.m中,不能為系統類添加擴展。

分類跟擴展的區別

擴展:在編寫完分類文件后,直接把分類內容添加到相關的宿主類上。
分類:是在運行時使用runtime把分類的內容添加到宿主類上。
?
?
?

代理

代理是一種設計模式,以@protocol形式體現。
一般是一對一傳遞,一般以weak關鍵詞以規避循環引用。
本質是獲得對象,調用方法返回數據。
?
?
?

通知

使用觀察者模式來實現的用于跨層傳遞信息的機制。
傳遞方式是一對多的。
原理是在通知中心維護一個map表,key為通知的名稱,value為observer。本質為持有對象,所以在不用時,需要釋放對象。
?
?
?

KVO

使用觀察者設計模式,使用isa混寫技術。
當A類實例被KVO監聽時,Runtime會轉建一個繼承自A類的新類NSKVONotifying_A,并重寫被觀察屬性的setter和getter方法。如果代碼中有創建NSKVONotifying_A類,注冊A類KVO時會崩潰。

何時觸發:

使用setter方法改變值時,會觸發KVO;
使用KVC setValue:forKey:改變值時,會觸發KVO;
成員變量直接修改,不會觸發KVO,需手動添加willChangeValueForKey和didChangeValueForKey方法才會觸發;

- (void)setName:(NSString *)newName { 
      [self willChangeValueForKey:@"name"];    //KVO 在調用存取方法之前總調用 
      [super setValue:newName forKey:@"name"]; //調用父類的存取方法 
      [self didChangeValueForKey:@"name"];     //KVO 在調用存取方法之后總調用
}

~
~
~

KVC

KVC的全稱是Key-Value Coding,俗稱“鍵值編碼”,可以通過一個key來訪問某個屬性。KVC的操作方法由NSKeyValueCoding提供,而他是NSObject的類別,也就是說ObjC中幾乎所有的對象都支持KVC操作。

常用方法
獲取值的方法
valueForKey:,傳入NSString屬性的名字。
valueForKeyPath:,傳入NSString屬性的路徑,xx.xx形式。
valueForUndefinedKey它的默認實現是拋出異常,可以重寫這個函數做錯誤處理。

修改值的方法
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValue:forKey的搜索過程:
  1. 首先搜索set<Key>:方法
    如果成員用@property,@synthsize處理,因為@synthsize告訴編譯器自動生成set<Key>:格式的setter方法,所以這種情況下會直接搜索到。
    注意:這里的<Key>是指成員名,而且首字母大寫。
  2. 上面的setter方法沒有找到,如果類方法accessInstanceVariablesDirectly返回YES(注:這是NSKeyValueCodingCatogery中實現的類方法,默認實現為返回YES)。
    那么按_<key>,_is<Key>,<key>,is<key>的順序搜索成員名。
  3. 如果還是沒有找到設置成員的值,就會調用setValue:forUndefinedKey:。
  4. 如果沒有重寫setValue:forUndefinedKey程序會馬上崩潰。
    ?
    ?
    ?

屬性關鍵字

1.讀寫權限:readonly,readwrite(默認)
2.原子性: atomic(默認),nonatomic。atomic讀寫線程安全,但效率低,而且不是絕對的安全,比如如果修飾的是數組,那么對數組的讀寫是安全的,但如果是操作數組進行添加移除其中對象的還,就不保證安全了。
3.引用計數:
retain/strong:引用計數加1
assign:修飾基本數據類型,修飾對象類型時,不改變其引用計數,會產生懸垂指針,修飾的對象在被釋放后,assign指針仍然指向原對象內存地址,如果使用assign指針繼續訪問原對象的話,就可能會導致內存泄漏或程序異常
weak:不改變被修飾對象的引用計數,所指對象在被釋放后,weak指針會自動置為nil
copy:分為深拷貝和淺拷貝
淺拷貝:對內存地址的復制,讓目標對象指針和原對象指向同一片內存空間會增加引用計數
深拷貝:對對象內容的復制,開辟新的內存空間


1782258-7e7fdc564b4dff02.png

可變對象的copy和mutableCopy都是深拷貝
不可變對象的copy是淺拷貝,mutableCopy是深拷貝
copy方法返回的都是不可變對象

@property (nonatomic, copy) NSMutableArray * array;這樣寫有什么影響?
因為copy方法返回的都是不可變對象,所以array對象實際上是不可變的,如果對其進行可變操作如添加移除對象,則會造成程序crash。
?
?
?
參考:Objective_C語言特性:分類、擴展
參考: iOS開發-OC篇-KVC詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373