IOS 學習筆記 2015-03-18,ios2015-03-18
Objective--C 一 關鍵字1 KVC 動態設值,動態取值,類似雨java中的反射,而且私人的照樣可以設定與擷取2 二 函數1 retain 給對象引用計數器 + 12 release 給對象引用計數器 - 13 dealloc 銷毀對象,當對象引起計數器為O時,自動調用該方法,4 autorelease 延遲釋放對象 5 setValue:forkey 設定對象屬性值(簡單)6 setvalue :forkeyPath 設定對象屬性值(複雜)7 valueForKey: 擷取對象屬性值 (簡單)8 valueForKeyPath 擷取對象屬性值(複雜)9 floatValue 字串轉flaot類型10 intValue 字串轉NSInteger類型三 規則 1 引用計數器 A 對象記憶體管理B 在OC中沒有垃圾自動回收機制,所以需要手動回收,所以用到了這個規則,其實在ObjC中記憶體的管理是依賴對象引用計數器來進行的:在ObjC中每個對象內部都有一個與之對應的整數(retainCount),叫“引用計數器”,當一個對象在建立之後它的引用計數器為1,當調用這個對象的alloc、retain、new、copy方法之後引用計數器自動在原來的基礎上加1(ObjC中調用一個對象的方法就是給這個對象發送一個訊息),當調用這個對象的release方法之後它的引用計數器減1,如果一個對象的引用計數器為0,則系統會自動調用這個對象的dealloc方法來銷毀這個對象。C 記憶體釋放的原則 誰建立,誰釋放D 關閉項目ARC 項目屬性—Build Settings--搜尋“garbage”找到Objective-C Automatic Reference Counting設定為No即可。2 自動釋放池A 在ObjC中也有一種記憶體自動釋放的機制叫做“自動引用計數”(或“自動釋放池”),與C#、Java不同的是,這隻是一種半自動的機制,有些操作還是需要我們手動設定的。自動記憶體釋放使用@autoreleasepool 關鍵字聲明一個代碼塊,如果一個對象在初始化時調用了autorelase方法,那麼當代碼塊執行完之後,在塊中調用過autorelease方法的對象都會自動調用一次release方法。這樣一來就起到了自動釋放的作用,同時對象的銷毀過程也得到了延遲(統一調用release方法)B autorelease方法不會改變對象的引用計數器,只是將這個對象放到自動釋放池中;C 自動釋放池實質是當自動釋放池銷毀後調用對象的release方法,不一定就能銷毀對象(例如如果一個對象的引用計數器>1則此時就無法銷毀);D 由於自動釋放池最後統一銷毀對象,因此如果一個操作比較佔用記憶體(對象比較多或者對象佔用資源比較多),最好不要放到自動釋放池或者考慮放到多個自動釋放池;E ObjC中類庫中的靜態方法一般都不需要手動釋放,內部已經調用了autorelease方法;3 索引值編碼KVCA KVC的操作方法由NSKeyValueCoding協議提供,而NSObject就實現了這個協議,也就是說ObjC中幾乎所有的對象都支援KVC操作B 動態設定: setValue:屬性值 forKey:屬性名稱(用於簡單路徑)、setValue:屬性值 forKeyPath:屬性路徑(用於複合路徑, 例如Person有一個Account類型的屬性,那麼person.account就是一個複合屬性)C 動態讀取: valueForKey:屬性名稱 、vamlueForKeyPath:屬性名稱(用於複合路徑)D KVC使用起來比較簡單,但是它如何尋找一個屬性進行讀取呢?具體尋找規則(假設現在要利用KVC對a進行讀取):I 如果是動態設定屬性,則優先考慮調用setA方法,如果沒有該方法則優先考慮搜尋成員變數_a,如果仍然不存在則搜尋成員變數a, 如果最後仍然沒搜尋到則會調用這個類的setValue:forUndefinedKey:方法(注意搜尋過程中不管這些方法、成員變數是私人的還是公用的都能正確設定); I 如果是動態讀取屬性,則優先考慮調用a方法(屬性a的getter方法),如果沒有搜尋到則會優先搜尋成員變數_a,如果仍然不存在則搜尋成員變數a, 如果最後仍然沒搜尋到則會調用這個類的valueforUndefinedKey:方法(注意搜尋過程中不管這些方法、成員變數是私人的還是公用的都能正確讀取); I E 無論對象的成員變數是私人還是公有,同樣可以動態設定,動態取值