- object-c 的多繼承
Objective-C不支持多繼承,由于消息機制名字查找發(fā)生在運行時而非編譯時暮胧,很難解決多個基類可能導(dǎo)致的二義性問題锐借;
可以繼承多個protocol(接口)问麸,實現(xiàn)協(xié)議方法,來間接實現(xiàn)繼承钞翔;
我們可以自己實現(xiàn)間接實現(xiàn)多繼承的方法:
消息轉(zhuǎn)發(fā)严卖、delegate&protocol、category - category 類別
在不改變代碼的情況下為類添加方法布轿,如果方法與原來方法沖突哮笆,將覆蓋原來方法,因為類別具有更高優(yōu)先級汰扭;
objc_setAssociatedObject 稠肘、objc_getAssociatedObject可為類添加實例;
extensions:
extensions可以認為是一個私有的Category萝毛;
category和extensions的不同在于后者可以添加屬性项阴,另外后者添加的方法是必須要實現(xiàn)的; - 消息轉(zhuǎn)發(fā)
首先類別及父類中查找消息
動態(tài)方法解析:resolveInstanceMethod笆包,有沒有用戶動態(tài)加入的方法
快速轉(zhuǎn)發(fā)消息:forwardingTargetForSelector环揽,若實現(xiàn)了這個方法,向返回的對象重新發(fā)送消息
標(biāo)準(zhǔn)消息轉(zhuǎn)發(fā):methodSignatureForSelector:獲得消息對應(yīng)的方法簽名色查,forwardInvocation轉(zhuǎn)發(fā)消息
PS:
快速消息轉(zhuǎn)發(fā):簡單薯演、快速、但僅能轉(zhuǎn)發(fā)給一個對象秧了。
標(biāo)準(zhǔn)消息轉(zhuǎn)發(fā):稍復(fù)雜跨扮、較慢、但轉(zhuǎn)發(fā)操作實現(xiàn)可控验毡,可以實現(xiàn)多對象轉(zhuǎn)發(fā) - delegate & protocol
將操作預(yù)留給委托對象來實現(xiàn)衡创;
比如tableview的委托給UITableViewController來處理;
delegate是一對一的關(guān)系晶通,notifacation是一對多的關(guān)系璃氢; -
import #include #class
import = #include + #pragma once
class 是告訴編譯器某個類的聲明,可解決頭文件的互相包含
import<>用來包含系統(tǒng)的頭文件狮辽,#import””用來包含用戶頭文件
- readwrite, readonly, assign, retain, copy, strong, weak一也,nonatomic
readwrite, readonly: setter與getter方法生成的修飾;
assign 是賦值屬性喉脖,引用對象時椰苟,weak會有安全釋放機制,assign不會
retain 增加retainCount是在非ARC下使用
copy 是復(fù)制屬性树叽,注意復(fù)制mutable類與非mutable類的區(qū)別
nonatomic 是非原子性修飾舆蝴,與atomic決定setter與getter是否需要原子性操作,原子性操作會影響性能,一般在iOS上都使用nonatomic洁仗,注意它只是對setter于getter進行加鎖處理层皱,不對其他方式進行同步處理; - object-c的數(shù)據(jù)類型
基本數(shù)據(jù)類型:
NSInteger赠潦、CGFloat
類數(shù)據(jù)類型:
NSString
NSNumber
NSArray
NSData
NSDictionary - id對象
id代表任意對象叫胖,具體運行時的特性;
可以執(zhí)行未定義方法,即使未定義:[(id)someObj doAnything]她奥; - iOS 內(nèi)存管理
手動內(nèi)存管理:非ARC狀態(tài)下臭家,可以了解
ARC:自動實現(xiàn)內(nèi)存管理,可以細致研究
NSAutoReleasePool 內(nèi)存池:深入了解原理 - iOS性能測試
Product --> Profile --> Instrument --> Time Profile - 多線程
創(chuàng)建線程的方法:
NSThread 不大常用
GCD 的dispatch 簡便但不容易控制
NSOperation + NSOperationQueue:自定義operation來實現(xiàn)操作方淤,可進行多方位監(jiān)聽與控制
PerformSelectorOnMainThread 主線程中執(zhí)行代碼
performSelector:onThread:withObject:waitUntilDone 在某個線程中延遲執(zhí)行代碼 - 設(shè)計模式
MVC模式:model - view - controller iOS本身設(shè)計使用mvc模式
代理模式 如delegate
單例模式,系統(tǒng)單例:UIApplication蹄殃、NSNotificationCenter携茂、NSFileManager、NSUserDefaults诅岩、NSURLCache讳苦、NSHTTPCookieStorage
觀察者模式 KVO,NSNotificationCenter - 深復(fù)制 & 淺復(fù)制
淺復(fù)制只是復(fù)制對象指針吩谦,類似與影子
深復(fù)制復(fù)制所有鸳谜,類似與克隆 - KVO & KVC
KVO使用方法:
addObserver:forKeyPath:options:context
observeValueForKeyPath:
KVO實際是在setter或getter時發(fā)送通知消息;
KVC調(diào)用對象流程(如[self valueForKey:@”someKey”]):
首先查找對象是否有someKey或getsomeKey方法式廷,如果沒有咐扭,
繼續(xù)查找是否有someKey或_someKey實例變量,如果沒有
會調(diào)用valueForUndefinedKey這個方法滑废,如果這個方法沒實現(xiàn)蝗肪,會拋出NSUndefinedKeyException異常; - 響應(yīng)鏈
詳細查看touch事件的組成蠕趁,還有事件傳遞的層級關(guān)系 - 延遲加載
一個延時加載薛闪,避免內(nèi)存過高;
一個異步加載俺陋,避免線程阻塞豁延; - iOS數(shù)據(jù)保存
通過web服務(wù),保存在服務(wù)器
通過NSCoder腊状,保存在本地文件中
通過NSUserDefaults诱咏,保存到系統(tǒng)plist文件中
通過SQlite或CoreData保存在數(shù)據(jù)庫中
PS:CoreData是蘋果提供一套數(shù)據(jù)保存框架,其基于SQlite寿酌; - CoreData的了解
NSManagedObject是NSObject的子類 胰苏,也是coredata的重要組成部分,它是一個通用的類,實現(xiàn)了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject硕并,建立自己的數(shù)據(jù)模型法焰;
NSManagedobjectContext對象負責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互; - 謂詞 NSPredicate
通過定義的過濾條件倔毙,對數(shù)據(jù)進行篩選埃仪;
如使用 filteredArrayUsingPredicate; - 網(wǎng)絡(luò)訪問
NSURLConnection
NSURLSession - object-c的私有
在Objective‐C中陕赃,所有實例變量默認都是私有的卵蛉,所有實例方法默認都是公有的 - Object-c與c/c++混編
oc代碼中直接使用c是沒問題的
在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題么库,但是cpp中不能使用oc語法傻丝; - cocoa touch框架
UIKit
Core Touch:
Core Animation
Core Audio
Core Data
Core Location - Object-c的優(yōu)缺點
優(yōu)點:category、動態(tài)識別
缺點:不支持命名空間诉儒、不支持運算符重載葡缰、所有方法都是函數(shù)調(diào)用,很多編譯時優(yōu)化方法都用不到忱反,性能比較低泛释; - 沙盒結(jié)構(gòu)
Documents: 永久數(shù)據(jù),會被iTunes同步温算;
Library 除了Library/Caches怜校,其他會被iTunes同步;Preferences目錄下存放偏好數(shù)據(jù)注竿,使用NSUserDefaults寫的設(shè)置數(shù)據(jù)都會保存到該目錄下的一個plist文件中茄茁;
tmp 各種臨時文件,保存應(yīng)用再次啟動時不需要的文件蔓搞,因為該目錄下的東西隨時有可能被系統(tǒng)清理掉胰丁;
函數(shù):NSHomeDirectory()乌叶、NSTemporaryDirectory()
Apple Files And Directories - loadView胡陪、viewDidLoad 恤批、viewDidUnload式散、viewDidAppear的調(diào)用時機
loadView 在controller的view為nil時調(diào)用域携;
viewDidLoad 只有在視圖控制器將其視圖載入到內(nèi)存之后才調(diào)用該方法丁存,這是執(zhí)行任何其他初始化操作的入口台夺;
viewDidUnload 在內(nèi)存在內(nèi)存不足時調(diào)用财松,釋放內(nèi)存梆掸;
viewWillAppear 視圖將要顯示為頂級視圖時調(diào)用扬卷;
viewDidAppear 視圖顯示為頂級視圖時調(diào)用; - iOS系統(tǒng)架構(gòu)
核心操作系統(tǒng)層 theCore OS layer
核心服務(wù)層theCore Services layer
媒體層 theMedia layer
觸摸層 the Cocoa Touch layer - 控件的三種事件響應(yīng)
基于觸摸的事件酸钦、基于值的事件怪得、基于編輯的事件 - 動畫的基本類型
隱式動畫、顯式動畫;
Cocoa Touch 提供了 4 種 Core Animation 過渡類型徒恋,分別為:交叉淡化蚕断、推擠、顯示和覆蓋入挣; - UIView 與 CALayer
設(shè)計用來功能分離亿乳;
UIView是CALayer的管理器,UIView是畫布径筏,CALayer是圖層葛假;
CALayer不能響應(yīng)事件; - iOS播放音頻
SystemSound Services
AVAudioPlayer 類
Audio Queue Services
OpenAL - 手勢方法
touchesBegan
touchesMoved
touchesEnded
touchesCanceled - Core Foundation 操作socket的方法
CFNetwork滋恬、CFSocket聊训、BSD Socket - tableview的重用機制
使用reuseIdentifier方法,會重用之前的單元格恢氯;
注意每次創(chuàng)建的單元格數(shù)目是顯示的單元格+1魔眨; - APNS的機制
- push viewController & present viewController
push是棧存放;
present是互相關(guān)系引用酿雪; - load & initialize
APP啟動后主動調(diào)用每個類的load,可添加新方法或交換方法侄刽;
initialize是在類第一次使用時調(diào)用指黎,可初始化變量等;
都是只調(diào)用一次
- 一些第三方庫
fmmpeg 音視頻編解碼框架
fmdb 對sqllite數(shù)據(jù)庫的封裝州丹,使用戶把主要精力放在sql語句上面
the end