第1章 iOS基礎(chǔ)
1.1 iOS發(fā)展歷史
1.iPhone OS 1.0
2007 iPhone Runs OS X、3.5大屏幕穿肄、多點(diǎn)觸控鸣戴、簡(jiǎn)潔UI、顛覆傳統(tǒng)
2.iPhone OS 2.0
2008 iPhone OS枪孩、App Store、收入三七分成
3.iPhone OS 3.0
2010 iOS3.2藻肄、劃時(shí)代蔑舞、針對(duì)iPad優(yōu)化
4.iOS 4
2010改名iOS、26%市場(chǎng)嘹屯、喬布斯設(shè)計(jì)團(tuán)隊(duì)復(fù)雜的光影效果攻询、仿真擬物風(fēng)格
5.iOS 5
新增Siri、通知中心
6.iOS 6
2012年6月
7.iOS 7
2013 設(shè)計(jì)風(fēng)格轉(zhuǎn)為扁平化設(shè)計(jì)
8.iOS 8
2014
9.iOS 9
10.iOS 10
1.2 iOS特性
1.界面設(shè)計(jì)
多點(diǎn)觸控州弟、交互方式
2.iOS內(nèi)置大量應(yīng)用程序
3.第三方支持
App Store
4.硬件支持
多點(diǎn)觸摸和手勢(shì)钧栖、統(tǒng)一的屏幕尺寸、高分辨率婆翔、重力加速器拯杠、指南針、藍(lán)牙和Wi-Fi連接
1.3 iOS架構(gòu)
- iOS可以看作底層和高層的集合
Cocoa Touch
Media
Core Services
Core OS
- 高層框架:為底層框架提供面向?qū)ο蟮某橄罂信梢詼p少編寫的代碼行數(shù)潭陪,對(duì)復(fù)雜功能的封裝,讓編寫代碼更加容易。并沒有屏蔽底層技術(shù)依溯,開發(fā)者也可以直接使用底層框架
1.3.1 Cocoa Touch層
包含創(chuàng)建iOS應(yīng)用所需的關(guān)鍵框架老厌,開發(fā)時(shí)盡量不要使用更底層的框架,盡可能使用該層的框架
1.Cocoa Touch層高級(jí)特性
- 多任務(wù)
- 數(shù)據(jù)保護(hù)
- 推送通知服務(wù)
- 本地通知
- 點(diǎn)對(duì)點(diǎn)服務(wù)
- 標(biāo)準(zhǔn)系統(tǒng)視圖控制器
2.Cocoa Touch層包含的框架
- Address Book UI 框架:聯(lián)系人頁(yè)面
- Event Kit UI 框架:用戶日程黎炉、日歷
- Game Kit 框架
- iAd 框架:iOS 10已廢棄
- Map Kit框架
- Message UI框架
- UIKit框架
1.3.2 媒體層
- iOS高層框架:快速創(chuàng)建
- iOS底層框架:完成特定需求的創(chuàng)建
1.媒體層高級(jí)屬性
- 圖形枝秤、視頻、音頻
2.媒體層包含的框架(常用)
- AVFoundation 框架
- Core Audio 框架
- Core Graphics 框架
- Core Text 框架
- Core Video 框架
- Image I/O 框架
- 媒體播放器框架
- OpenGL ES 框架
- OpenAL 框架
- Quartz Core 框架
- 資產(chǎn)庫(kù)框架
1.3.3 Core Services 層
提供基礎(chǔ)服務(wù)慷嗜,是系統(tǒng)很多部分賴以構(gòu)建的基礎(chǔ)
1.Core Services層高級(jí)特性
- 快對(duì)象
- Grand Gentral Dispatch---GCD
- 應(yīng)用內(nèi)購(gòu)買
- 定位服務(wù)
- SQLite庫(kù)
- XML支持:NSXMLParser類解析元素
2.Core Services層包含的框架
- AddressBook 框架
- CFNetwork框架
- Core Data框架
- Core Foundation框架
- Core Location框架
- Core Media框架
- Core Telephony框架
- Event Kit框架
- Foundation框架
- Mobile Core Services框架
- Quick Look框架
- Store Kit框架
- System Configuration框架
1.3.4 Core OS層
直接處理安全事務(wù)或和某個(gè)外設(shè)通信時(shí)淀弹,必須用到該框架。
- Accelerate框架
- External Accessory框架
- Security框架
- System框架
1.4 Objective-C概述
- Smalltalk特性
1.5 比較iOS和macOS
1.5.1 UIKit與AppKit的對(duì)比
1.5.2 Foundation框架的差異
1.5.3 其他框架的改變
1.6 iOS開發(fā)環(huán)境和工具
1.6.1 了解Xcode
1.6.2 Xcode導(dǎo)航面板
- 項(xiàng)目導(dǎo)航
- 符號(hào)導(dǎo)航:以類洪添、方法垦页、屬性的形式來(lái)顯示項(xiàng)目中所有的類、方法和屬性干奢,方便快速定位
- 搜索導(dǎo)航
- 問(wèn)題導(dǎo)航
- 測(cè)試導(dǎo)航:白盒測(cè)試結(jié)果
- 調(diào)試導(dǎo)航
- 斷點(diǎn)導(dǎo)航
- 日志導(dǎo)航
1.6.3 Xcode檢查器面板
左邊
- 文件路徑
- 自動(dòng)換行等
右邊 - 詳細(xì)幫助信息
- 參考手冊(cè)
- 使用指南等
xib等多出的功能 - 身份檢查器
- 屬性檢查器
- 大小檢查器
- 連接檢查器
1.6.4 Xcode庫(kù)面板
- 文件模版庫(kù)
- 代碼片段庫(kù)
- 對(duì)象庫(kù)
- 媒體庫(kù)
1.6.5 使用幫助
1.使用快速幫助面板
2.利用搜索框
3.利用編輯區(qū)的快速幫助
1.7 使用Xcode
1.7.1 案例:編寫第一個(gè)Objective-C程序
main函數(shù)的作用:
- 創(chuàng)建自動(dòng)釋放池
文件后綴的含義:
- .cpp : C++語(yǔ)言源文件
- .mm : C++語(yǔ)言源文件(實(shí)現(xiàn).h文件)
- .o : 編譯后的文件
- .app : 編譯后的可執(zhí)行文件(可在iPhone痊焊、iPad或macOS上運(yùn)行的文件)
1.7.2 案例:創(chuàng)建第一個(gè)項(xiàng)目
1.8 小結(jié)
第2章 數(shù)據(jù)類型和運(yùn)算符
2.1 數(shù)據(jù)類型分類
- OC是強(qiáng)類型語(yǔ)言
- 指針類型是OC最重要的類型,所有的系統(tǒng)類忿峻、自定義類的本質(zhì)都是指針類型
2.2 簡(jiǎn)單數(shù)據(jù)類型
2.2.1 整型
2.2.2 案例:輸出格式字符
2.2.3 浮點(diǎn)型
2.2.4 字符型
2.2.5 案例:定義字符串
- NSString不是簡(jiǎn)單數(shù)據(jù)類型薄啥,而是一個(gè)對(duì)象類型
2.2.6 枚舉型
2.2.7 布爾型
2.3 類型轉(zhuǎn)換
2.3.1 案例:自動(dòng)類型轉(zhuǎn)換
- 溢出:把取值范圍大的變量的值付給取值范圍小的變量時(shí)
2.3.2 案例:強(qiáng)制類型轉(zhuǎn)換
- (類型說(shuō)明符)(表達(dá)式)
2.3.3 案例:自動(dòng)提升
2.4 運(yùn)算符
2.4.1 運(yùn)算符分類
- 位操作運(yùn)算符:位與(&)、位或(|)逛尚、位非(~)垄惧、位異或(^)、左移(<<)绰寞、右移(>>)
- 復(fù)合位運(yùn)算賦值:&=到逊、|=、^=滤钱、>>=觉壶、<<=
2.4.2 運(yùn)算優(yōu)先級(jí)
2.4.3 算術(shù)運(yùn)算符
2.4.4 賦值運(yùn)算符
2.4.5 位運(yùn)算符
- 按位與運(yùn)算符
- 按位或
- 按位異或
- 一次求反
- 向左移位
- 向右移位
2.4.6 比較運(yùn)算符
2.4.7 邏輯運(yùn)算符
2.4.8 逗號(hào)運(yùn)算符
2.4.9 條件運(yùn)算符
2.5 小結(jié)
第3章 控制語(yǔ)句
3.1 條件語(yǔ)句
3.1.1 if語(yǔ)句
3.1.2 案例:分支語(yǔ)句應(yīng)用
3.1.3 switch語(yǔ)句
3.2 循環(huán)語(yǔ)句
3.2.1 while語(yǔ)句
3.2.2 do-while語(yǔ)句
3.2.3 for語(yǔ)句
3.2.4 案例:for語(yǔ)句應(yīng)用
3.2.5 案例:嵌套循環(huán)
3.3 控制語(yǔ)句
3.3.1 break語(yǔ)句
3.3.2 continue語(yǔ)句
3.3.3 return語(yǔ)句
3.3.4 案例:使用goto語(yǔ)句
3.4 預(yù)處理命令
#import
#define
3.4.1 宏定義
- 1.無(wú)參數(shù)宏定義
- 2.帶參數(shù)的宏定義
3.4.2 運(yùn)算符
- "#"運(yùn)算符
- "##"運(yùn)算符
3.4.3 #import語(yǔ)句
- 1.#import與#include的聯(lián)系和區(qū)別
- 2.#import與@Class的聯(lián)系和區(qū)別
提高編譯效率;
消除循環(huán)依賴關(guān)系件缸;
3.4.4 條件編譯
- 1.#if指令
- 2.#endif指令
- 3.#ifdef和#ifndef
- 4.#else指令
3.5 小結(jié)
第4章 C語(yǔ)言特性
- 一些應(yīng)用程序?yàn)榱藘?yōu)化會(huì)要求使用底層方法铜靶,如使用C語(yǔ)言的內(nèi)置數(shù)據(jù)結(jié)構(gòu)優(yōu)化大型數(shù)據(jù)數(shù)組
4.1 數(shù)組(C語(yǔ)言)
- 基本數(shù)據(jù)類型的數(shù)組
4.1.1 定義數(shù)組
4.1.2 初始化數(shù)組
4.1.3 使用數(shù)組
- arrlength = sizeof(arr)/sizeof(arr[0])
4.1.4 定義多維數(shù)組
4.1.5 初始化多維數(shù)組
4.1.6 使用字符數(shù)組
4.1.7 案例實(shí)戰(zhàn)
4.2 函數(shù)(C語(yǔ)言)
4.2.1 定義函數(shù)
4.2.2 聲明函數(shù)
- 形參名可省略
4.2.3 函數(shù)類型
4.2.4 函數(shù)參數(shù)
4.2.5 函數(shù)返回值
4.2.6 案例實(shí)戰(zhàn)
- 遞歸運(yùn)算:如遍歷未知深度路徑下的所有文件
- 數(shù)組參數(shù)
4.3 塊
4.3.1 定義塊
^[塊返回值類型](形參類型1 形參1,形參類型2 形參2,...)
{
// 塊執(zhí)行體
}
塊返回值類型 (^塊變量名)(形參類型1 形參1, 形參類型2 形參2,...) {
// 塊執(zhí)行體
}
5.2.3 self
- 哪些語(yǔ)言有self關(guān)鍵字?
- OC中的->運(yùn)算符他炊,運(yùn)用場(chǎng)景之一:當(dāng)局部變量和成員變量同名時(shí)争剿,系統(tǒng)默認(rèn)局部變量隱藏成員變量,為了消除這種隱藏關(guān)系痊末,就可以使用self->來(lái)強(qiáng)調(diào)要使用的是成員變量
- 關(guān)于@property自動(dòng)生成set/get方法與懶加載的關(guān)系:自動(dòng)生成了set/get方法蚕苇,也需要手動(dòng)調(diào)用set方法才會(huì)給這個(gè)成員變量賦有意義的值,懶加載優(yōu)化了賦值凿叠;平時(shí)使用的很多涩笤,靠的都是記憶,這次是加深了理解绒净;
5.2.4
- id類型體現(xiàn)OC的動(dòng)態(tài)綁定特性
- 想到OC中的@property到底是什么作用管钳,每天都在用缀去,為什么一定要用?不用的話有什么替代方案锰茉?
5.2.5 類名的使用
5.2.6 類的比較
5.3 變量
5.3.1 局部變量
5.3.2 全局變量
OC全局變量:1.extern 2.單例
全局變量會(huì)增加代碼耦合度
5.3.3 實(shí)例變量
@private @protected @public @package
@public變量使對(duì)象無(wú)法隱藏它的數(shù)據(jù),違背面向?qū)ο蠡驹瓌t--將數(shù)據(jù)封裝在對(duì)象中切心,防止被隨意瀏覽和修改飒筑。盡量少用
5.3.4 靜態(tài)變量
static也是常用的一個(gè)關(guān)鍵字,雖然有替代的方案(寫在.m文件頭部的靜態(tài)常量绽昏,如cell的identifierID)协屡,但是不清楚使用static和成員變量的區(qū)別與適用場(chǎng)景
靜態(tài)局部變量:函數(shù)內(nèi)用static聲明的
register關(guān)鍵字:寄存器,避免頻繁讀寫內(nèi)存
5.3.5 變量的存儲(chǔ)類別
動(dòng)態(tài)存儲(chǔ)變量和靜態(tài)存儲(chǔ)變量
靜態(tài)存儲(chǔ)區(qū)會(huì)一直占有內(nèi)存全谤,直到運(yùn)行結(jié)束才釋放肤晓,包括全局變量和static修飾的局部變量
auto關(guān)鍵字:局部變量默認(rèn)方式,自動(dòng)存儲(chǔ)機(jī)制认然,自動(dòng)局部變量
靜態(tài)變量與自動(dòng)變量的一個(gè)區(qū)別是:系統(tǒng)是否會(huì)為其設(shè)置默認(rèn)值
const:變量->常量
為什么static與const要一起使用补憾?不使用static會(huì)怎樣?
目前的理解是使用static會(huì)更加安全卷员,將常量作用域限制在當(dāng)前類中盈匾。
實(shí)驗(yàn)了一下:在兩個(gè).m文件中分別定義同一個(gè)不用static修飾的const常量,build時(shí)會(huì)報(bào)錯(cuò)
5.3.6 案例:定義單例類
5.3.7 案例:定義類變量
5.4 屬性
@property
5.4.1 屬性的聲明
readonly修飾詞
自己如何修改自定義的readonly屬性毕骡,以及為何通過(guò)kvc嘗試修改別人的readonly和禁止別人通過(guò)kvc在外部修改自己的readonly屬性
關(guān)鍵方法:accessInstanceVariablesDirectly
5.4.2 屬性的實(shí)現(xiàn)
@dynamic關(guān)鍵字
5.4.3 屬性類型和相關(guān)函數(shù)
5.4.4 屬性類型編碼
5.4.5 屬性重聲明
可以在類擴(kuò)展中把readonly重定義為readwrite
5.4.6 字類中的屬性
5.4.7 案例:使用封裝
封裝削饵、繼承、多態(tài)
多態(tài):沒有繼承就沒有多態(tài)未巫,父類指針可以指向字類對(duì)象窿撬,OC只有方法名多態(tài)
5.4.8 案例:使用訪問(wèn)控制符
5.4.9 案例:合成存取
@property
assign:不更改引用計(jì)數(shù)
atomic:原子操作,線程安全
readonly:只生成getter方法橱赠,不生成setter方法
unsafe_unretained:與weak類似尤仍,不如weak安全
copy:防止將可變字符串賦給字符串,導(dǎo)致字符串被隨意篡改
5.4.10 案例:點(diǎn)語(yǔ)法存取
5.5 方法
5.5.1 定義方法
方法調(diào)用->傳遞消息
5.5.2 方法的所屬性
OC傳參機(jī)制:值傳遞狭姨,傳入?yún)?shù)的副本宰啦,指針變量做參數(shù),指針本身保存的是副本饼拍,所以相當(dāng)于地址傳遞
5.5.3 案例:設(shè)計(jì)可變形參的方法
, ...
va_list赡模、va_start、va_end师抄、va_arg
個(gè)數(shù)可變的形參只能處于形參列表的最后漓柑,也就是說(shuō),一個(gè)方法最多只能有一個(gè)長(zhǎng)度可變的形參
5.6 繼承
樹形結(jié)構(gòu)
5.6.1 繼承實(shí)例變量
5.6.2 方法的繼承
5.6.3 方法的重寫
5.6.4 類別和擴(kuò)展
動(dòng)態(tài)機(jī)制
Category必須引用類的接口文件,有.h和.m
Extension只有.h文件辆布,常用于一個(gè)類除了公開聲明的API外瞬矩,再定義一些私有的方法
5.6.5 案例:類繼承
OC摒棄了C++中的多繼承特征
5.6.6 重寫
5.6.7 案例:使用super關(guān)鍵字
子類重定義(在.m中)和父類完全相同的
5.7 異常處理
5.7.1 啟用異常處理
5.7.2 異常處理
5.7.3 捕捉不同類型的異常
5.7.4 拋出異常
一般使用@throw拋出NSException對(duì)象,也可以拋出任何OC對(duì)象,只是NSException比較方便
5.8 類型
5.8.1 靜態(tài)指定類型
5.8.2 類型的自查
5.9 根類
NSObject NSProxy
NSProxy被定義為抽象類,用于表示其他對(duì)象的替身對(duì)象锋玲。
5.9.1 NSObject簡(jiǎn)介
其他類通過(guò)從NSObject繼承來(lái)訪問(wèn)OC語(yǔ)言運(yùn)行時(shí)系統(tǒng)的基本接口景用。
NSObject協(xié)議
java.lang.Object Java版本的Cocoa
5.9.2 根類和協(xié)議
NSObject不僅是一個(gè)類的名稱,還是一個(gè)協(xié)議的名稱惭蹂。
NSObject協(xié)議指定了OC中所有根類(包括NSProxy)必須有的基本編程接口伞插。
5.9.3 根類方法
NSObject包含:NSObject協(xié)議和其他一些"根"協(xié)議,指定了通用的接口和行為
1.分配盾碗、初始化和復(fù)制
alloc:分配內(nèi)存媚污、指向運(yùn)行時(shí)的類定義
init
new
2.對(duì)象的保持和清理
3.內(nèi)省和比較
isSubclassOfClass:
類方法 instancesRespondToSelector:
4.對(duì)象的編碼和解碼
Coder編碼器
NSCoder為抽象類,不能被實(shí)例化
自定義對(duì)象的歸檔
5.消息的轉(zhuǎn)發(fā)
forwardInvocation:
6.消息的派發(fā)
performSelector 延遲派發(fā)廷雅,將消息從輔助線程派發(fā)到主線程
OC是一門動(dòng)態(tài)語(yǔ)言
5.9.4 根類接口規(guī)范
5.9.5 根類實(shí)例方法和類方法
5.10 小結(jié)
6.消息和協(xié)議
OC的兩大特色耗美,使OC具有更強(qiáng)的靈活性和簡(jiǎn)潔性,同時(shí)保持了更高的擴(kuò)展性和高內(nèi)聚榜轿、低耦合的特性幽歼。
6.1 消息
OC與C++的區(qū)別:C++類與方法緊密結(jié)合,不能調(diào)用一個(gè)類中不存在的方法谬盐;OC中類與消息的關(guān)系較為松散甸私,方法都視為對(duì)消息的回應(yīng),runtime時(shí)才會(huì)動(dòng)態(tài)決定
6.1.1 定義消息
方法名在消息中通常被稱為選擇器
6.1.2 發(fā)送消息
行nil發(fā)送消息飞傀,是被允許的皇型,運(yùn)行時(shí)沒有效果。
6.1.3 接收實(shí)例對(duì)象
6.1.4 獲取方法地址
Cocoa運(yùn)行時(shí)提供的功能:methodForSelector:砸烦,來(lái)避免動(dòng)態(tài)綁定弃鸦,將減少大部分消息的開銷,但是這只有在指定的消息被重復(fù)發(fā)送很多次才有意義幢痘,
并不是OC語(yǔ)言本身的功能唬格。
Cocoa:是Apple為Mac OS X所創(chuàng)建的原生面向?qū)ο蟮腁PI,是Mac OS X上五大API之一颜说,其他四個(gè)是Carbon购岗、POSIX、X11门粪、Java
6.1.5 objc_msgSend()函數(shù)
OC中喊积,消息是直到運(yùn)行時(shí)才和方法實(shí)現(xiàn)綁定的。
[reveiver message] -> objc_msgSend(receiver, selector)
編譯器為類生成的結(jié)構(gòu)玄妈,至少包含兩個(gè)基本元素:
- 指向父類的指針
- 類的方法表乾吻,方法表將方法選標(biāo)和方法實(shí)現(xiàn)的地址關(guān)聯(lián)起來(lái)
isa:指向該對(duì)象的類結(jié)構(gòu)的指針髓梅,從NSObject或NSProxy繼承的對(duì)象都自動(dòng)包括isa變量
為了加快消息的處理過(guò)程,運(yùn)行時(shí)系統(tǒng)通常會(huì)將使用過(guò)的方法選標(biāo)和方法實(shí)現(xiàn)的地址放入緩存中绎签,每個(gè)類都有一個(gè)獨(dú)立的緩存枯饿,同時(shí)包括繼承的方法和在該類中定義的方法。
6.1.6 使用隱藏的參數(shù)
6.1.7 消息轉(zhuǎn)發(fā)
forwardInvocation:消息
對(duì)象無(wú)法處理一條消息時(shí)诡必,運(yùn)行時(shí)會(huì)在拋出錯(cuò)誤前發(fā)送該消息鸭你。
實(shí)現(xiàn)forwardInvocation:方法對(duì)不能處理的消息進(jìn)行一些默認(rèn)處理,或者將消息轉(zhuǎn)發(fā)給其他對(duì)象擒权。
場(chǎng)景1:設(shè)計(jì)一個(gè)能夠響應(yīng)某消息的對(duì)象,并且包括其他類型對(duì)象對(duì)消息的響應(yīng)阁谆。
場(chǎng)景2:希望一個(gè)對(duì)象能和另一個(gè)類的對(duì)象都某消息的響應(yīng)完全一致碳抄,且這兩個(gè)類不在同一個(gè)繼承鏈中。
invokeWithTarget:方法來(lái)轉(zhuǎn)發(fā)
6.1.8 消息轉(zhuǎn)發(fā)與多重繼承
轉(zhuǎn)發(fā)消息的對(duì)象看起來(lái)有兩個(gè)繼承體系场绿,自己的和響應(yīng)消息的對(duì)象的剖效。
只是能夠模擬多繼承的特性,本質(zhì)上還是不同焰盗,多繼承可能會(huì)導(dǎo)致龐大的璧尸,復(fù)雜的對(duì)象,消息轉(zhuǎn)發(fā)不會(huì)熬拒。
6.1.9 消息代理對(duì)象
6.1.10 消息轉(zhuǎn)發(fā)與類繼承
respondsToSelector:只能出現(xiàn)在繼承鏈中爷光,不能出現(xiàn)在消息轉(zhuǎn)發(fā)鏈中。
如果希望代理對(duì)象看起來(lái)就像繼承自它代表的對(duì)象一樣澎粟,需要重新實(shí)現(xiàn)respondsToSelector:蛀序、isKindOfClass:、instancesRespondToSelector:活烙、conformsToProtocol:等方法徐裸。
methodSignatureForSelector:方法必須能返回實(shí)際響應(yīng)消息的方法的描述。
6.1.11 多態(tài)性
不同的對(duì)象可以對(duì)同一個(gè)消息做出不同的響應(yīng)啸盏。
6.1.12 動(dòng)態(tài)綁定
C的方法調(diào)用:編譯時(shí)確定綁定關(guān)系
OC的發(fā)送消息:運(yùn)行時(shí)確定
6.1.13 解析動(dòng)態(tài)方法
resolveInstanceMethod:和resolveClassMethod:動(dòng)態(tài)實(shí)現(xiàn)@dynamic.
OC方法可以認(rèn)為是至少有兩個(gè)參數(shù)(self和_cmd)的C函數(shù)重贺。
消息轉(zhuǎn)發(fā)和動(dòng)態(tài)方法解析是互不相干的,動(dòng)態(tài)方法解析時(shí)機(jī)更前回懦。
6.1.14 動(dòng)態(tài)加載
OC在運(yùn)行時(shí)鏈接和載入新的類和范疇類气笙。
NSBundle類為動(dòng)態(tài)加載提供了一個(gè)更方便的接口。
6.1.15 "."語(yǔ)法格式
好處之一:點(diǎn)語(yǔ)法可以在試圖修改只讀屬性時(shí)報(bào)錯(cuò)粉怕,使用[ ]語(yǔ)法只會(huì)出現(xiàn)警告健民,運(yùn)行時(shí)才失敗。
6.1.15.1 "."語(yǔ)法格式一般用法
6.1.15.2 nil值
6.1.15.3 點(diǎn)語(yǔ)法引用訪問(wèn)方法
6.1.15.4 點(diǎn)語(yǔ)法的錯(cuò)誤用法
6.1.15.5 性能和線程處理
使用點(diǎn)語(yǔ)法不會(huì)引入額外的線程開銷贫贝。
6.2 協(xié)議
非正式協(xié)議與編譯器保證的正式協(xié)議
6.2.1 預(yù)定義聲明接口
Cocoa大量使用協(xié)議來(lái)實(shí)現(xiàn)通過(guò)OC消息進(jìn)行進(jìn)程間的通信秉犹。
6.2.2 預(yù)定義方法
用協(xié)議來(lái)為未定義的類規(guī)定接受特定消息的能力蛉谜。
6.2.3 聲明接口
協(xié)議使匿名對(duì)象成為可能,沒有協(xié)議崇堵,就沒有辦法聲明一個(gè)對(duì)象的接口而不指明它的類型诚。
6.2.4 非層級(jí)相似性
用抽象類繼承的方法來(lái)為共通方法分組是不可行的,有時(shí)一些不相關(guān)的類卻要實(shí)現(xiàn)一些相似的方法鸳劳,而有限的相似之處又不足以建立一種繼承的關(guān)系狰贯。協(xié)議可以實(shí)現(xiàn)。
6.2.5 正式協(xié)議
編譯器可以基于協(xié)議進(jìn)行類型校驗(yàn)赏廓。
6.2.5.1 聲明一個(gè)協(xié)議
類名有全局可見的屬性涵紊,協(xié)議名沒有全局可見屬性,只能存在于自己的命名空間幔摸。
6.2.5.2 可選的協(xié)議方法
默認(rèn)為@required.
協(xié)議的繼承和類繼承不一樣摸柄,協(xié)議完全支持多繼承。
6.2.6 非正式協(xié)議
類別或類擴(kuò)展既忆。
正式協(xié)議:只聲明不實(shí)現(xiàn)驱负;
非正式協(xié)議:既聲明又實(shí)現(xiàn);
6.2.7 協(xié)議對(duì)象
正式協(xié)議也是由協(xié)議類的實(shí)例所表現(xiàn)的患雇。和類對(duì)象一樣跃脊,協(xié)議對(duì)象也是由系統(tǒng)在運(yùn)行時(shí)使用代碼中定義的方法和聲明的變量來(lái)創(chuàng)建,都不在程序的源代碼中分配內(nèi)存和初始化苛吱。
源代碼中可以用@protocol()引用一個(gè)協(xié)議對(duì)象酪术。
只有在協(xié)議被類遵守或使用@protocol()時(shí)編譯器才會(huì)創(chuàng)建協(xié)議對(duì)象。
6.2.8 采用協(xié)議
分類中也可以使用協(xié)議翠储。
6.2.9 服從協(xié)議
conformsToProtocol:
之前幾年自己開發(fā)過(guò)程中用的比較多的協(xié)議和代理綁定使用拼缝,單純的協(xié)議用的少,導(dǎo)致在B站代碼中有不熟悉的使用方式彰亥,其實(shí)原理都很簡(jiǎn)單咧七。
6.2.10 類型校驗(yàn)
id<協(xié)議名>對(duì)象名
6.2.11 嵌套協(xié)議
6.2.12 引用其他協(xié)議
6.3 小結(jié)
OC兩大特色:消息和協(xié)議
7.對(duì)象
對(duì)象->類的實(shí)例。
面向?qū)ο蟪绦蚴菄@著對(duì)象建立起來(lái)的任斋。
對(duì)象的狀態(tài)->表示對(duì)象的實(shí)例變量
對(duì)象的方法->對(duì)象的操作性继阻,操作對(duì)象的狀態(tài)
對(duì)象 -> 編程單元 -> 數(shù)結(jié)構(gòu)(實(shí)例變量) + 一組程序(方法)
7.1 創(chuàng)建對(duì)象
創(chuàng)建對(duì)象的兩個(gè)階段:對(duì)象分配 + 初始化。
初始化總是緊跟對(duì)象分配废酷,但這兩個(gè)步驟的作用是不同的瘟檩。
7.1.1 分配對(duì)象
為對(duì)象分配足夠的內(nèi)存。
其他重要工作:
- 對(duì)象計(jì)數(shù)器置為1
- 使對(duì)象的isa指向類澈蟆,類是根據(jù)類定義編譯得到的運(yùn)行時(shí)對(duì)象
- 將對(duì)象的所有實(shí)例變量初始化為0或與0等價(jià)的類型
7.1.2 初始化對(duì)象
7.1.2.1 對(duì)象初始化實(shí)現(xiàn)
init方法墨辛。
自定義初始化方法唯一的要求是必須以init開頭。
iOS的多參數(shù)方法規(guī)則:第一個(gè)和最重要的參數(shù)之前使用Withxx:或Fromxx:.
7.1.2.2 初始化方法
初始化可能失敗趴俘,返回nil睹簇,使用前需要校驗(yàn)奏赘。
7.1.2.3 實(shí)現(xiàn)一個(gè)初始化方法
7.1.2.4 多個(gè)初始化方法和指定初始化方法
輔助初始化方法:其內(nèi)部需要調(diào)用指定的初始化方法,為沒有顯式要求的參數(shù)傳入默認(rèn)值太惠。防止沒有被完全初始化磨淌。確保所有繼承到的初始化方法都被覆蓋是很重要的。
指定初始化方法:覆蓋面最大的初始化方法凿渊,也負(fù)責(zé)通過(guò)向super發(fā)送消息來(lái)調(diào)用父類中的指定初始化方法梁只。
7.1.3 delloc方法
確保對(duì)象的實(shí)例變量被釋放,并確保動(dòng)態(tài)分配的內(nèi)存被釋放埃脏。
init方法先調(diào)用父類初始化方法搪锣,delloc方法最后調(diào)用父類方法。
7.1.4 類工廠方法
將分配和初始化合在一起彩掐,并進(jìn)行自動(dòng)釋放處理淤翔。
工廠類的優(yōu)勢(shì)之一:init必須先分配一個(gè)對(duì)象,工廠方法可以避免生成用不到的對(duì)象佩谷,不會(huì)盲目生成對(duì)象。
7.2 對(duì)象動(dòng)態(tài)類型
id监嗜、nil和其他OC基礎(chǔ)類型都是在objc/objc.h中定義的谐檀。
id被定義為一個(gè)對(duì)象數(shù)據(jù)結(jié)構(gòu)的指針。
isa變量:表示對(duì)象是哪個(gè)類的實(shí)例
7.3 對(duì)象可變性
7.3.1 可變或不可變對(duì)象
7.3.2 用可變對(duì)象編程
7.3.2.1 創(chuàng)建和轉(zhuǎn)換可變對(duì)象
7.3.2.2 存儲(chǔ)和返回可變實(shí)例變量
7.3.2.3 接收可變對(duì)象
7.3.2.4 集合中的可變對(duì)象
7.4 對(duì)象通信
實(shí)現(xiàn)對(duì)象間的通信機(jī)制的幾個(gè)設(shè)計(jì)模式:委托裁奇、通知桐猬、目標(biāo)-動(dòng)作、綁定技術(shù)
7.4.1 面向?qū)ο蟪绦蛑械耐ㄐ?/h3>
程序中的對(duì)象還動(dòng)態(tài)地存在于一個(gè)網(wǎng)絡(luò)中刽肠,與管弦樂隊(duì)中的音樂家之間的合作方式類似溃肪,程序中的每個(gè)對(duì)象都有一個(gè)角色,為了在程序中發(fā)揮作用音五,角色必須能夠和其他對(duì)象進(jìn)行通信惫撰。
7.4.2 IBOutlet變量
xib相關(guān)原理。
IBOutlet對(duì)象的引用是有Interface Builder來(lái)配置和歸檔的躺涝。每次包含對(duì)象從nib文件解檔時(shí)厨钻,其與插座變量之間的連接都需要重新建立。
7.4.3 委托和數(shù)據(jù)源
7.4.3.1 委托
非正式協(xié)議的方法標(biāo)志著進(jìn)行任務(wù)委托的對(duì)象需要處理或預(yù)期發(fā)生的重大事件坚嗜。
委托處理的事用戶界面的控制夯膀,而數(shù)據(jù)源處理的是對(duì)數(shù)據(jù)的控制。
7.4.4 目標(biāo)-動(dòng)作機(jī)制
7.4.4.1 控件苍蔬、單元和菜單項(xiàng)
7.4.4.2 目標(biāo)
7.4.4.3 動(dòng)作
7.4.4.4 Application Kit定義的動(dòng)作
7.4.4.5 設(shè)置目標(biāo)和動(dòng)作
7.4.5 綁定
7.4.5.1 綁定的工作機(jī)制
7.4.5.2 創(chuàng)建綁定
7.4.6 通告
代理:一對(duì)一
通知:一對(duì)多
通知中心
7.4.6.1 通告對(duì)象
7.4.6.2 通知中心
7.4.6.3 通知隊(duì)列
先進(jìn)先出FIFO的順序維護(hù)通知诱建,每個(gè)線程都有一個(gè)默認(rèn)的通知隊(duì)列。
7.4.6.4 通知隊(duì)列發(fā)送模式
盡快發(fā)送碟绑、空閑時(shí)發(fā)送俺猿、立即發(fā)送
7.5 使用對(duì)象
7.5.1 對(duì)象所有權(quán)策略
7.5.2 保留計(jì)數(shù)
7.5.3 自動(dòng)釋放
7.5.4 共享對(duì)象的有效性
7.5.5 存取方法
7.5.6 回收對(duì)象
7.5.7 通過(guò)引用返回的對(duì)象
7.6 小結(jié)
8.Foundation框架基礎(chǔ)
8.1 認(rèn)識(shí)Foundation框架
值對(duì)象
NSValue和NSNumber類為簡(jiǎn)單的標(biāo)量值數(shù)組提供面向?qū)ο蟮拇鎯?chǔ)空間茎匠。字符串
集合
操作系統(tǒng)服務(wù)
NSProcessInfo:查詢運(yùn)行環(huán)境
NSHost:主機(jī)系統(tǒng)在網(wǎng)絡(luò)中的名稱和地址
NSTimer
NSRunLoop
NSUserDefaults文件系統(tǒng)和URL
NSFileManager
NSFileHandle:較為底層的文件操作,如文件內(nèi)查找操作
NSBundle:尋找儲(chǔ)存在程序包中的資源
NSURL和NSURLHandle進(jìn)程間通信
NSPipe線程和子任務(wù)
NSThread
NSTask:程序可以分出一個(gè)子進(jìn)程來(lái)執(zhí)行其他工作或進(jìn)行進(jìn)度監(jiān)控歸檔和序列化
NSCoder
NSCoding協(xié)議表達(dá)式和條件判斷
NSPredicate 謂詞
NSCompoundPredicate
NSComparisonPredicate
NSExpressionSpotlight(聚光燈)查詢
NSMetadataItem
NSMetadataQuery
查詢?cè)獢?shù)據(jù)OC語(yǔ)言服務(wù)
NSException 例外
NSAssertionHandler 斷言
NSInvocation
NSMethodSignature
NSClassDescription腳本
分布式對(duì)象
NSDistantObject
NSProtocolChecker
根類是NSProxy網(wǎng)絡(luò)
NSNetService
NSNetSerciceBorwser
Bonjour系統(tǒng)提示
Foundation框架:OC接口
Core Foundation框架:C語(yǔ)言接口
Toll-free bridging
8.2 使用Foundation框架
8.3 數(shù)字類型
NSNumber是NSValue的子類
8.3.1 數(shù)字類型類NSNumber
數(shù)字對(duì)象的聲明辜荠、創(chuàng)建汽抚、初始化、轉(zhuǎn)換等
8.3.1.1 數(shù)字對(duì)象的聲明
任何數(shù)字對(duì)象都可以用NSNumber來(lái)聲明伯病。
8.3.1.2 數(shù)字對(duì)象的創(chuàng)建
每個(gè)基本數(shù)字類型造烁,都有一個(gè)對(duì)應(yīng)的類方法。
numberWith開頭午笛,
numberWithLong: numberWithFloat:等
8.3.1.3 數(shù)字對(duì)象的初始化
實(shí)例方法initWithLong: initWithFloat:等惭蟋。
類方法---實(shí)例方法---檢索方法
8.3.2 比較int、NSInteger药磺、NSUInteger和NSNumber
NSInteger:不用考慮設(shè)備是32位還是64位的告组。
NSArray:存放是對(duì)象,不能存放基礎(chǔ)類型癌佩。
8.4 字符串類型
8.4.1 不可變字符串類NSString
8.4.1.1 不可變字符串的創(chuàng)建
NSString是一個(gè)對(duì)象木缝,char *是一個(gè)字節(jié)數(shù)組。
8.4.1.2 不可變字符串的遍歷
8.4.1.3 不可變字符串的比較
8.4.2 可變字符串類NSMutableString
8.4.2.1 可變字符串的創(chuàng)建
8.4.2.2 可變字符串的增刪
字符串的大小并不僅限于所提供的容量围辙,僅僅是一個(gè)最優(yōu)結(jié)構(gòu)我碟。
8.4.2.3 可變字符串的替換
8.4.3 案例實(shí)戰(zhàn)
OC的字符串處理比C語(yǔ)言簡(jiǎn)單、易用姚建。
8.5 日期類型
Time Interval(間隔):秒級(jí)別
8.5.1 日期類型類NSDate
- 創(chuàng)建和初始化
- 日期比較
- 時(shí)間間隔處理
8.5.1.1 創(chuàng)建日期
類方法[NSDate date]等價(jià)于[[NSDate alloc] init].
8.5.1.2 日期與字符串的轉(zhuǎn)換
NSDateFormatter
8.5.1.3 獲取日期各個(gè)部分整數(shù)值
dateWithCalendarFormat:
yearOfCommonEra矫俺、monthOfYear、dayOfMonth掸冤、dayOfWeek等
8.5.2 NSCalendar和NSDateComponents
656
8.5.3 案例實(shí)戰(zhàn)
8.6 數(shù)組類型
8.6.1 不可變數(shù)組類NSArray
8.6.1.1 不可變數(shù)組的創(chuàng)建
8.6.1.2 不可變數(shù)組的遍歷
8.6.1.3 不可變數(shù)組的復(fù)制
8.6.1.4 不可變數(shù)組的排序
8.6.2 可變數(shù)組類NSMutableArray
8.6.2.1 可變數(shù)組的初始化
8.6.2.2 可變數(shù)組的增刪
8.6.2.3 可變數(shù)組的替換
8.6.3 多維數(shù)組
8.6.4 案例:操作數(shù)組
8.6.5 案例:操作元素
makeObjectsPerformSelector: 調(diào)用數(shù)組中每個(gè)元素的指定方法厘托。
enumerateObjectsUsingBlock:遍歷集合中所有元素,并依次使用元素執(zhí)行指定的代碼塊稿湿。
684
8.6.6 案例:數(shù)組排序
sort排序函數(shù)
ordered 組織有序的铅匹;descend 下降;ascend上升
NSOrderedDescending等等饺藤。usingFunction:context:
usingSelector:
usingComparator:
NSString的compare:方法
8.6.7 案例:遍歷數(shù)組
reverse 顛倒
objectEnumerator: 或 reverseObjectEnumerator:方法
8.6.8 案例:快速枚舉
foreach循環(huán) 概念
8.6.9 案例:可變數(shù)組
692
8.7 字典類型
8.7.1 不可變字典類NSDictionary
8.7.1.1 不可變字典的創(chuàng)建
8.7.1.2 不可變字典的查詢
8.7.2 可變字典類NSMutableDictionary
8.7.2.1 可變字典的創(chuàng)建
8.7.2.2 可變字典的添加
8.7.2.3 可變字典的刪除
8.7.3 案例:使用字典
8.7.4 案例:字典排序
keysSortedByValueUsingSelector:
keysSortedByValueUsingComparator:
keysSortedByValueWithOptions:
8.7.5 案例:字典過(guò)濾
keysOfEntriesPassingTest:
keysOfEntriesWithOptions:passingTest:
8.7.6 案例:使用可變字典
8.8 案例實(shí)戰(zhàn):集合類型
NSArray--有序伊群、可重復(fù),元素可以是基本類型策精,有索引
NSSet--無(wú)序舰始、不可重復(fù),元素只能是對(duì)象咽袜,無(wú)索引
NSOrderedSet--有序丸卷、不可重復(fù),有索引
NSDictionary--具有映射關(guān)系
8.8.1 使用NSSet
NSSet沒有索引询刹,不能根據(jù)索引來(lái)操作元素谜嫉。
和NSArray的共同點(diǎn):
- count方法
- for-in快速枚舉
- objectEnumerator方法
- makeObjectsPerformSelector: 方法等
- valueForKey: 和 setValue:forKey:進(jìn)行KVC編程
- KVO編程
NSSet自有方法:
- setByAddingObject:等幾個(gè)添加元素方法
- allObject: 返回?cái)?shù)組
- anyObject: 返回某個(gè)不確定元素
- containsObject: 是否包含
- member:
- objectsPassingTest: 過(guò)濾
- isSubsetOfSet: 是否是另一個(gè)集合的子集合
- intersectsSet: 兩個(gè)集合是否有交集
8.8.2 檢測(cè)NSSet重復(fù)值
存入元素前萎坷,會(huì)先比較hashCode是否相同,不相同就是新元素沐兰,存入成功哆档;相同的話會(huì)接著比較isEqual:,不相同會(huì)存在底層Hash表同一個(gè)位置住闯,將這個(gè)位置形成鏈瓜浸,相同則添加失敗。
8.8.3 可變集合
NSMutableSet
unionSet:計(jì)算兩集合并集
minusSet: 計(jì)算兩集合差集
8.8.4 計(jì)數(shù)集合
NSCountedSet 是 NSMutableSet 的子類比原。
為每個(gè)元素額外維護(hù)一個(gè)添加次數(shù)的狀態(tài)插佛。類似于內(nèi)存管理機(jī)制的引用次數(shù)。
8.8.5 有序集合
NSOrderedSet于NSMutableOrderedSet
8.9 小結(jié)
722
9 iOS應(yīng)用開發(fā)核心
9.1 iOS應(yīng)用架構(gòu)
UIApplication對(duì)象:從系統(tǒng)接收事件
9.1.1 生命周期
程序啟動(dòng)到終止期間量窘。
進(jìn)入app后雇寇,大量初始化工作就交給UIKit,事件循環(huán)蚌铜。
9.1.2 主函數(shù)
Main函數(shù):
- 創(chuàng)建自動(dòng)釋放池
- 調(diào)用UIApplicationMain()函數(shù)
- 使用自動(dòng)釋放池
UIApplicationMain()的四個(gè)參數(shù):
- argc锨侯,C語(yǔ)言概念,發(fā)送給main函數(shù)的命令行參數(shù)的個(gè)數(shù)
- argv冬殃,C語(yǔ)言概念囚痴,存放只想字符串參數(shù)的指針
- 首要類,為nil時(shí)造壮,UIKit默認(rèn)使用UIApplication類
- 應(yīng)用委托類,一般為AppDelegate
9.1.3 應(yīng)用委托
委托是一種避免對(duì)復(fù)雜的UIKit對(duì)象(如UIApplication對(duì)象)進(jìn)行子類化的機(jī)制骂束。避免對(duì)復(fù)雜對(duì)象進(jìn)行修改耳璧。
負(fù)責(zé)處理幾個(gè)關(guān)鍵的系統(tǒng)消息。
遵循UIApplicationDelegate協(xié)議展箱。
9.1.4 nib文件
用戶儲(chǔ)存可在應(yīng)用程序需要時(shí)使用的一些“凍結(jié)”的對(duì)象旨枯。
將nib文件載入應(yīng)用程序時(shí),nib裝載代碼會(huì)將文件中的內(nèi)容轉(zhuǎn)換為應(yīng)用程序可以操作的真正對(duì)象混驰。
通過(guò)這個(gè)機(jī)制攀隔,nib文件省去了用代碼創(chuàng)建這些對(duì)象的工作。
Interface Builder:是一個(gè)可視化的設(shè)計(jì)環(huán)境栖榨,可以用來(lái)創(chuàng)建nib.
9.1.5 事件處理周期
UIEvent:事件對(duì)象昆汹。
UITouch:觸摸對(duì)象,對(duì)應(yīng)一個(gè)手指婴栽。
系統(tǒng)發(fā)送的觸摸事件會(huì)在隊(duì)列中等待满粗,知道被應(yīng)用程序的主運(yùn)行循環(huán)處理。
9.1.6 基本設(shè)置模式
9.2 運(yùn)行環(huán)境處理機(jī)制
快速而安全愚争。
9.2.1 快速啟動(dòng)
每次只有一個(gè)前臺(tái)應(yīng)用映皆,所以程序必須快速啟動(dòng)和初始化挤聘,以盡可能減少延遲,否則會(huì)為用戶帶來(lái)不好的體驗(yàn)捅彻。
退出時(shí)组去,需要盡快將未保存的修改保存到磁盤上,如果超過(guò)5秒步淹,系統(tǒng)會(huì)立刻終止程序運(yùn)行从隆。
9.2.2 安全處理
沙盒可以限制攻擊者對(duì)其他程序和系統(tǒng)造成的破壞,但是不能防止攻擊的發(fā)生贤旷,不能使程序避免惡意的直接攻擊广料。
如在輸入處理代碼中有一個(gè)可利用的緩沖區(qū)溢出,而又沒有對(duì)用戶輸入進(jìn)行正當(dāng)性檢查幼驶,則黑客可能會(huì)通過(guò)這種漏洞來(lái)執(zhí)行代碼艾杏。
9.2.3 內(nèi)存處理
iOS與Mac OS X都使用虛擬內(nèi)存系統(tǒng)。
內(nèi)存釋放:釋放沒有在使用的內(nèi)存頁(yè)面->向正在運(yùn)行的程序發(fā)出釋放內(nèi)存的通告盅藻。
9.2.4 節(jié)電處理
自動(dòng)休眠定時(shí)器购桑。
游戲或其他特定應(yīng)用可以禁用該定時(shí)器。
737
9.3 程序包
[NSBundle mainBundle]用于返回一個(gè)代表程序包的對(duì)象氏淑。
9.3.1 信息屬性
Info.plist
Show Raw Keys/Values
9.3.2 程序圖標(biāo)和啟動(dòng)圖像
9.4 定制行為
9.4.1 景觀模式啟動(dòng)
橫屏or豎屏顯示勃蜘。
9.4.2 與其他程序通信
openURL:
9.4.3 URL模式
可以在Safari中輸入定制的URL來(lái)確定是否可以啟動(dòng)app.
9.4.4 處理URL請(qǐng)求
application:handleOpenURL:
9.4.5 偏好設(shè)置
9.4.6 關(guān)閉鎖定
9.5 鍵盤管理
9.5.1 接收鍵盤通知
鍵盤焦點(diǎn)變化時(shí)。會(huì)發(fā)送UIKeyboardWillHideNotification通知當(dāng)前鍵盤所有者即將失去焦點(diǎn)假残,不會(huì)發(fā)送UIKeyboardDidHideNotification通知缭贡。
鍵盤方向改變時(shí),UIKeyboardWillHideNotification和UIKeyboardDidHideNotification通知都會(huì)發(fā)出辉懒,因?yàn)椴煌较虻逆I盤是不同的阳惹。
鍵盤通知包含鍵盤在屏幕上的位置和尺寸。
9.5.2 顯示鍵盤
調(diào)用becomeFirstResponder方法與點(diǎn)擊視圖使其成為第一響應(yīng)者效果一致眶俩。
9.5.3 取消鍵盤
9.5.4 移動(dòng)鍵盤
UIScrollView類的scrollRectToVisible:animated:方法將被單擊的文本框滾動(dòng)到視圖中莹汤。
keyboardWasShown:
9.6 國(guó)際化
9.7 優(yōu)化處理
9.7.1 不要阻塞主線程
主線程阻塞,可能影響程序的正常啟動(dòng)和退出颠印。導(dǎo)致意外的bug.
9.7.2 有效使用內(nèi)存
把減少應(yīng)用程序的內(nèi)存開銷放在較高優(yōu)先級(jí)上纲岭,及時(shí)清除自己使用的內(nèi)存。
9.7.3 減少內(nèi)存印跡
- 消除內(nèi)存泄漏
- 盡量減小資源文件
- 使用數(shù)據(jù)庫(kù)處理大的數(shù)據(jù)集合
- 謹(jǐn)慎預(yù)載入线罕,真正需要預(yù)載入時(shí)才進(jìn)行操作止潮,否則會(huì)浪費(fèi)內(nèi)存
9.7.4 恰當(dāng)分配內(nèi)存
9.7.5 浮點(diǎn)計(jì)算
典型情況下,基于硬件的浮點(diǎn)數(shù)計(jì)算比對(duì)應(yīng)的基于軟件的定點(diǎn)數(shù)計(jì)算快得多钞楼。
9.7.6 減少電力消耗
提高電池壽命沽翔。
原則:
- 避免需要輪詢的工作,這樣會(huì)組織CPU進(jìn)入休眠狀態(tài),可以通過(guò)NSRunLoop或NSTimer來(lái)規(guī)劃工作仅偎。
- idleTimerDisabled屬性保持為NO.
- 將任務(wù)合并在一起跨蟹,使空閑時(shí)間最大化,間歇性執(zhí)行任務(wù)比一次性完成相同數(shù)量的任務(wù)消耗更多電能橘沥,也會(huì)阻止系統(tǒng)長(zhǎng)時(shí)間無(wú)法關(guān)閉硬件窗轩。
- 避免過(guò)度訪問(wèn)磁盤。
訪問(wèn)網(wǎng)絡(luò)的耗電量座咆。
傳遞的數(shù)據(jù)越多痢艺,就需要越多的電能來(lái)進(jìn)行無(wú)線發(fā)射。訪問(wèn)網(wǎng)絡(luò)是所能進(jìn)行的最耗電操作介陶。
網(wǎng)絡(luò)訪問(wèn)原則:
- 需要時(shí)再連接網(wǎng)絡(luò)堤舒,不對(duì)服務(wù)器進(jìn)行輪詢。
- 使用緊湊的數(shù)據(jù)格式哺呜,不要包含可被忽略的額外數(shù)據(jù)舌缤。
- 盡可能以群發(fā)方式傳遞數(shù)據(jù)包。
- Wi-Fi耗電比系帶無(wú)線少。
- 使用Core Location定位服務(wù)時(shí),設(shè)置恰當(dāng)?shù)木群瓦^(guò)濾器的值瓤的,及時(shí)關(guān)閉硬件。
722
9.7.7 代碼優(yōu)化
優(yōu)化工具:
- 消除內(nèi)存泄漏
- 排除代碼中可能由低效算法或已知瓶頸引起的計(jì)算熱點(diǎn)
Instruments程序
模擬器與真機(jī)差別:模擬器運(yùn)行在Mac OS X 上介牙,具有更快的CPU和更多的可用內(nèi)存,比真機(jī)性能好很多澳厢,所以盡量用真機(jī)环础,更可能發(fā)現(xiàn)額外的性能瓶頸。
9.8 小結(jié)
10 iOS開發(fā)入門
10.1 熟悉iOS項(xiàng)目
10.1.1 文件結(jié)構(gòu)
InfoPlist.strings--國(guó)際化支持文件
10.1.1.1 Test文件夾
10.1.1.2 TestTests文件夾
10.1.1.3 Products文件夾
.app文件所在
10.1.2 新建xib界面文件
替換storyboard為xib文件過(guò)程剩拢。
10.1.3 認(rèn)識(shí)xib界面
- Placeholder列表區(qū)
- Objects列表區(qū)
.xib與.nib的區(qū)別:
- .xib是XML文件线得,.nib是二進(jìn)制格式文件。
- 編譯時(shí)裸扶,會(huì)將.xib轉(zhuǎn)換為.nib框都,不存在性能差別搬素。
- 開發(fā)者使用.xib更方便呵晨,因?yàn)槭俏谋疚募菀妆容^和版本控制熬尺。
10.1.4 添加控件
Control+Option+Command + 數(shù)字:打開不同的庫(kù)面板摸屠。
Editor->Canvas->Show Layout Rectangles:顯示UI控件輪廓。
10.1.5 編輯控件屬性
右邊功能區(qū)域:
- 文件檢查器面板
- 操作歷史面板
- 快速幫助
- 身份檢查
- 屬性檢查
- 大小檢查
- 連接檢查
Label的屬性檢查面板:
- Label支持的屬性
- 父類View支持的屬性
10.1.6 UIView屬性
10.1.6.1 Mode
圖片對(duì)齊方式粱哼、是否縮放季二。
縮放選項(xiàng)會(huì)帶來(lái)額外的處理開銷。
10.1.6.2 Tag
10.1.6.3 Interaction
- UserInterfaceENable--是否可點(diǎn)
- Multiple Touch--是否支持多點(diǎn)觸摸
10.1.6.4 Alpha
10.1.6.5 Background
10.1.6.6 Drawing
Opaque--不透明,通知iOS系統(tǒng)胯舷,該控件后面的任何內(nèi)容都無(wú)須繪制刻蚯,即使Alpha值小于1.0,使程序保持好性能桑嘶。
Hidden
Clears Graphics Context--先清除該控件所覆蓋的區(qū)域炊汹,再開始繪制該控件,系統(tǒng)執(zhí)行額外的清除操作逃顶,性能會(huì)降低讨便。
Clip Subviews
Autoresize Subviews
10.1.6.7 Streching
拉伸區(qū)域。
800
10.1.7 UILabel屬性
10.1.7.1 Text
10.1.7.2 Color
10.1.7.3 Font
10.1.7.4 Alignment
10.1.7.5 Lines
10.1.7.6 Behavior
10.1.7.7 Line Break
10.1.7.8 Autoshrink
自動(dòng)收縮
10.1.7.9 Highlighted
10.1.7.10 Shadow
10.1.7.11 Shadow Offset
10.2 iOS運(yùn)行機(jī)制
10.2.1 了解MVC
10.2.2 入口函數(shù)
Main函數(shù)負(fù)責(zé)生成UIApplication對(duì)象以政。
10.2.3 應(yīng)用程序委托
UIApplication對(duì)象->代表整個(gè)iOS應(yīng)用程序本身霸褒,為全局對(duì)象。
AppDelegate是UIApplication的代理盈蛮,是整個(gè)iOS應(yīng)用的通信中心废菱。
獲取AppDelegate對(duì)象方法:
AppDelegate *appDelegate = [UIApplication shareApplication].delegate ;
AppDelegate繼承自UIResponder類,遵守UIApplicationDelegate協(xié)議眉反。
10.2.4 視圖控制器
UIViewController
viewWillLayoutSubviews:
viewDidLayoutSubviews:
10.3 事件處理機(jī)制
10.3.1 獲取控件
10.3.1.1 通過(guò)IBOutlet屬性獲取控件
10.3.1.2 通過(guò)Tag屬性獲取控件
10.3.2 事件處理
10.3.2.1 通過(guò)IBAction綁定事件
通過(guò)xib拉線方式創(chuàng)建事件昙啄。
10.3.2.2 通過(guò)代碼設(shè)置事件
10.3.2.3 通過(guò)委托對(duì)象設(shè)置事件
10.4 故事板
Storyboard與xib區(qū)別:
- SB的dock區(qū)域多了一個(gè)場(chǎng)景Scene的概念
Scene = view + vc + 第一響應(yīng)者
10.5 案例實(shí)戰(zhàn)
862
10.5.1 動(dòng)態(tài)更新文本
純代碼開發(fā)并不是最好的方式,原因:
- 步驟繁瑣
- 不符合MVC設(shè)計(jì)原則寸五,不利于組件解耦
10.5.2 添加和刪除控件
10.5.3 設(shè)計(jì)跟隨手指的小球
UIView子類可以重寫的方法:
initWithCoder: nib文件中加載完控件后會(huì)自動(dòng)調(diào)用該方法梳凛。
didAddSubview: 添加子控件后調(diào)用。
willRemoveSubView: 將要?jiǎng)h除子控件時(shí)梳杏。
willMoveToSuperview: 控件將要添加到父視圖中時(shí)韧拒。
didMoveToSuperView:
willMoveToWindow:
didMoveToWindow:
10.5.4 設(shè)計(jì)應(yīng)用項(xiàng)目圖標(biāo)
10.5.5 設(shè)計(jì)歡迎界面
10.6 小結(jié)
11 窗口和視圖
11.1 認(rèn)識(shí)窗口和視圖
11.1.1 窗口
Window在Mac OS X與iOS的區(qū)別:
- NSWindow的父類是NSResponder
- UIWindow的父類是UIView
11.1.2 視圖
1.1.2.1 描畫和動(dòng)畫
1.1.2.2 布局和子視圖管理
1.1.2.3 事件處理
11.1.3 視圖控制器
11.2 視圖架構(gòu)
11.2.1 視圖交互模型
11.2.2 視圖渲染架構(gòu)
Core Animation(CALayer類的實(shí)例):
- 在Mac OS X上是可選的。
- 在iOS上是視圖渲染實(shí)現(xiàn)的核心十性。
當(dāng)UIView類沒有提供需要的接口時(shí)叛溢,就可以深入到Core Animation層,實(shí)現(xiàn)一些復(fù)雜的渲染劲适。
11.2.3 CoreAnimation
CoreAnimation利用硬件加速和架構(gòu)上的優(yōu)化來(lái)實(shí)現(xiàn)快速渲染和實(shí)時(shí)動(dòng)畫楷掉。
會(huì)捕捉首次繪制后的信息到位圖中,方便后續(xù)重用霞势。
層樹:存儲(chǔ)和View對(duì)象相關(guān)聯(lián)的Layer.兩組層樹烹植,表示樹和渲染樹。
11.2.3 視圖的層
layerClass類方法:可以重載View的Layer類型愕贡。通常用在基于OpenGL的app中草雕。
11.2.5 動(dòng)畫支持
UIView支持動(dòng)畫的屬性:frame、bounds固以、center墩虹、transform和alpha.
11.2.6 視圖坐標(biāo)系統(tǒng)
11.2.7 邊框嘱巾、邊界和中心
900
11.2.8 坐標(biāo)系統(tǒng)變換
11.2.9 內(nèi)容模式與比例縮放
11.2.10 自動(dòng)尺寸調(diào)整
11.3 創(chuàng)建和管理視圖層次
11.3.1 視圖層次
11.3.2 創(chuàng)建視圖對(duì)象
11.3.3 添加和移除子視圖
isDescendantOfView: 是否包含某個(gè)view
11.3.4 坐標(biāo)轉(zhuǎn)換
11.3.5 標(biāo)識(shí)視圖
11.4 動(dòng)態(tài)控制視圖
11.4.1 實(shí)現(xiàn)視圖動(dòng)畫
11.4.2 配置動(dòng)畫的參數(shù)
setAnimationRepeatCount: 動(dòng)畫重復(fù)次數(shù)。
setAnimationRepeatAutoreverses: 自動(dòng)反向播放诫钓。
setAnimationBeginsFromCurrentState: 使動(dòng)畫線程中的動(dòng)畫停止旬昭,立即啟動(dòng)新動(dòng)畫。
setAnimationsEnabled: 是否激活動(dòng)畫菌湃。
動(dòng)畫線程稳懒。
11.4.3 配置動(dòng)畫的委托
setAnimationDelegate:方法設(shè)置代理。
11.4.4 響應(yīng)布局的變化
layoutSubviews:
11.4.5 重畫視圖的內(nèi)容
setNeedDisplay:
setNeedDisplayInRect:
drawRect:
11.4.6 隱藏視圖
11.5 創(chuàng)建定制視圖
11.5.1 初始化定制視圖
11.5.2 描畫視圖內(nèi)容
clearsContextBeforeDrawing: 提高描畫性能慢味。
11.5.3 響應(yīng)事件
hitTest:withEvent:
pointInside:withEvent:
11.5.4 清理視圖對(duì)象
11.6 小結(jié)
930
12 視圖控制器
12.1 視圖控制器基礎(chǔ)
12.1.1 視圖控制器的功能
12.1.2 屏幕场梆、窗口和視圖元素
12.1.3 視圖管理機(jī)制
12.1.4 視圖控制器分類
UIViewController的子類分為:
- 內(nèi)容類視圖控制器
- 容器類視圖控制器
12.1.5 內(nèi)容展示方式
12.1.6 視圖控制器混合應(yīng)用
12.2 視圖控制器生命周期
12.2.1 初始化視圖
12.2.1.1 xib創(chuàng)建VC
xib把vc保存為一個(gè)XML文件。
12.2.2 加載和卸載視圖
12.2.2.1 視圖控制器加載周期
viewDidLoad方法調(diào)用前的邏輯流程纯路,保證view一定有值或油。
loadView方法:重寫時(shí)不需要調(diào)用父類super方法。
12.2.2.2 vc卸載周期
viewWillUnload方法:開發(fā)過(guò)程中還沒接觸過(guò)驰唬。
12.3 標(biāo)準(zhǔn)視圖控制器
UIViewController
12.3.1 UIViewController概述
12.3.2 使用標(biāo)準(zhǔn)視圖控制器
12.4 SplitViewController
iPad專屬顶岸。
12.4.1 SplitViewController概述
12.4.2 使用SplitViewController
12.5 導(dǎo)航控制器
NavigationController
12.5.1 NavigationController概述
12.5.2 使用NavigationController
12.6 TabBarController
12.6.1 概述
12.6.2 使用
12.7 PageViewController
12.7.1 概述
翻頁(yè)效果。
12.7.2 使用
12.8 小結(jié)
986
13 事件
UIEvent
- 觸摸事件
- 運(yùn)動(dòng)事件
13.1 觸摸事件
基于多點(diǎn)觸摸叫编。
13.1.1 觸摸模型
多點(diǎn)觸摸序列辖佣,序列元素為:觸摸特征=位置+觸摸時(shí)間。
手指接觸區(qū)域:大致是橢圓的搓逾,比想象的位置更靠下卷谈,底層的多點(diǎn)觸摸系統(tǒng)會(huì)分析這些信息,計(jì)算出單一的觸點(diǎn)霞篡。
13.1.2 觸摸與事件
觸摸信息:時(shí)間 和 空間
時(shí)間方面:階段(phrase)
UITouch : 觸摸
UIEvent : 事件
事件的取消可能是由于重載系統(tǒng)事件引起的世蔗,如電話呼入。
13.1.3 事件傳遞
事件隊(duì)列朗兵。
sendEvent : UIApplication對(duì)象和UIWindow對(duì)象派發(fā)事件的方法污淋。
exclusiveTouch 獨(dú)占觸摸屬性。
13.1.4 事件響應(yīng)過(guò)程
UIResponder :所有響應(yīng)者對(duì)象的基類余掖。
13.1.5 事件處理方法
UIResponder 聲明的一些方法:
touchesBegan:
touchesMoved:
locationInView: 當(dāng)前位置
previousLocationInView: 前一個(gè)位置
跟蹤UITouch對(duì)象的變化:
可以以UITouch對(duì)象的地址作為鍵寸爆,位置作為值,存儲(chǔ)在CFDictionaryRef類型中盐欺。
CFDictionaryRef與NSDictionary的區(qū)別:
NSDictionary需要對(duì)存儲(chǔ)項(xiàng)目進(jìn)行復(fù)制赁豆,存儲(chǔ)內(nèi)容需要遵守NSCoping協(xié)議;CFDictionaryRef不需要這些找田,;UITouch不遵守NSCoping歌憨,所以應(yīng)選用CFDictionaryRef.
13.1.6 案例:處理多點(diǎn)觸摸事件
判斷是兩次獨(dú)立的單擊還是一次雙擊着憨。
13.1.7 案例:檢測(cè)碰擦收拾
swipe
13.1.8 案例:處理復(fù)雜多點(diǎn)觸摸序列
1007
13.2 運(yùn)動(dòng)事件
如搖擺設(shè)備墩衙。
motionBegan:withEvent:
motionEnded:withEvent:
motionCancelled:withEvent:
13.3 復(fù)制、剪切和粘貼
UIMenuController類:顯示編輯菜單
UIResponder類: canPerformAction:withSender:
UIResponderStandardEditActions非正式協(xié)議
13.3.1 認(rèn)識(shí)粘貼板
可通過(guò)定制URL類型傳輸數(shù)據(jù)。
公共
私有:自己創(chuàng)建漆改,設(shè)置persistent為yes心铃,可在程序退出后繼續(xù)存在。
UIPastedboardNameGeneral : 剪切挫剑、復(fù)制和粘貼去扣。
UIPastedboardNameFind : 檢索操作。
可以有一個(gè)或多個(gè)數(shù)據(jù)項(xiàng)樊破。
13.3.2 數(shù)據(jù)表示
同一個(gè)數(shù)據(jù)項(xiàng)的多種表示愉棱。
UTI : 某種表示的唯一類型標(biāo)識(shí)符。
粘貼板讀取程序必須找到最適合自身能力的數(shù)據(jù)類型哲戚。
變化計(jì)數(shù):隨著粘貼板內(nèi)容的變化而遞增奔滑。
13.3.3 選擇菜單
多選操作。
13.3.4 復(fù)制和剪切
13.3.5 粘貼
13.3.6 消除菜單
13.4 小結(jié)
14 使用空間(上)
友好的圖形用戶界面顺少,是吸引用戶的關(guān)鍵朋其。
UIView:定義了視圖的基本行為,但不定義視圖的視覺表示脆炎。
UIKit:定義了具體的視覺外觀和行為梅猿,提供了大量標(biāo)準(zhǔn)界面元素。
14.1 UIKit 概述
14.1.1 視圖分類
- 控件:UIControl子類
- 窗口:UIWindow
- 容器視圖
- 顯示視圖
- 文本和Web視圖
- 導(dǎo)航視圖
- 警告框和操作表
14.1.2 應(yīng)用界面構(gòu)成
14.1.3 UIView視圖
UIView:繼承自UIResponder
14.1.4 UIControl控件
1033
14.2 按鈕
14.2.1 添加按鈕
14.2.2 案例:定義按鈕
14.2.3 案例:配合使用標(biāo)簽和按鈕
14.3 UITextField
14.4 UITextView
14.5 UISwitch
14.6 UISegmentedControl
14.7 UISlider
14.8 UIImageView
animationImages屬性播放幻燈片秒裕。
14.9 UIProgressView
14.10 UIActivityIndicatorView
14.11 UIAlertView
14.12 UIActionSheet
14.13 UIDatePicker
14.14 UIPickerView
14.15 UIStepper 微調(diào)器
14.16 UIWebView
14.17 小結(jié)
15 使用控件(下)
15.1 UIToolBar
15.2 UISearchBar
15.3 導(dǎo)航條
15.4 UITableView
15.5 UITabBarController
15.6 UIPageControl
15.7 小結(jié)
1350
16 移動(dòng)繪圖
- OpenGL
- Quartz 2D袱蚓、Core Animation、UIKit
16.1 基本概念
繪制都發(fā)生在UIView對(duì)象區(qū)域內(nèi)几蜻。
16.1.1 繪制周期
觸發(fā)drawRect:的幾個(gè)場(chǎng)景癞松。
16.1.2 坐標(biāo)系統(tǒng)
CTM:轉(zhuǎn)換矩陣,是一個(gè)數(shù)學(xué)矩陣入蛆,可以修改默認(rèn)的坐標(biāo)系統(tǒng)响蓉。也會(huì)降低創(chuàng)建路徑的開銷。
16.1.3 圖形上下文
16.1.4 點(diǎn)和像素
16.1.5 顏色空間
CGContextSetRGBStrokeColor()
CGContextSetRGBFillColor()
16.1.6 圖像格式
.tiff哨毁、.bmp枫甲、.ico、.cur扼褪、.xbm
16.1.7 定制繪制
沉浸式應(yīng)用:廣泛使用定制的繪制代碼想幻;
工具型和效率型:使用標(biāo)準(zhǔn)的視圖和控件顯示內(nèi)容就可以。
16.1.8 繪制性能
繪制的開銷比較昂貴话浇。
優(yōu)化繪制代碼的方法:
- 最小化
- 標(biāo)識(shí)為不透明
- 刪除PNG中的Alpha通道
- 避免清除原先內(nèi)容
等
16.1.9 圖像質(zhì)量
- PNG:iOS對(duì)PNG的繪制路徑經(jīng)過(guò)優(yōu)化脏毯。
- 避免調(diào)整尺寸,減小CPU開銷幔崖。
16.2 Quartz 2D
高級(jí)二維繪圖引擎食店。
16.2.1 頁(yè)面
page:疊加更多繪畫渣淤,不同的繪制順序所產(chǎn)生的效果不一樣。
16.2.2 圖形上下文
GraphicsContext:CGContextRef數(shù)據(jù)類型吉嫩。包含所有與設(shè)備相關(guān)的特性价认,不需要任何設(shè)備相關(guān)的計(jì)算,都由Quart完成自娩。
UIKit與Quartz坐標(biāo)系統(tǒng)不同用踩,使用CTM轉(zhuǎn)換。
1368
16.2.3 路徑
2D幾何形狀忙迁。
UIRectFrame()和UIRectFill()創(chuàng)建矩形簡(jiǎn)單路徑脐彩。
shapes subpath
16.2.3.1 路徑的創(chuàng)建
16.2.3.2 構(gòu)建塊
點(diǎn)、線姊扔、弧丁屎、曲線
關(guān)閉子路徑:會(huì)添加一條線,線旱眯、弧和曲線通常不會(huì)關(guān)閉路徑晨川。
16.2.3.3 路徑的創(chuàng)建和繪制
BeginPath()、MoveToPoint()
可復(fù)用路徑:CGPathRef删豺、CGMutablePathRef
16.2.3.4 顏色空間
Quartz重的顏色用一組值來(lái)表示共虑,顏色空間用于解析這些信息。如RGB呀页、HSB妈拌、BGR.
16.2.5 變換
Quartz 2D定義了兩種獨(dú)立的坐標(biāo)空間:用戶空間和設(shè)備空間。用戶空間用浮點(diǎn)數(shù)表示坐標(biāo)蓬蝶,與設(shè)備空間的像素分辨路沒有關(guān)系尘分。
CTM修改用戶空間。
變換矩陣函數(shù)丸氛。
CGContextDrawImage()
16.2.5.1 平移變換
CGContextTranslateCTM()
16.2.5.2 旋轉(zhuǎn)變換
CGContextRotateCTM()
弧度與角度轉(zhuǎn)換函數(shù)培愁。
16.2.5.3 縮放變換
CGContextScaleCTM(),負(fù)數(shù)可以倒轉(zhuǎn)坐標(biāo)軸缓窜。
16.2.5.4 聯(lián)合變換
CGContextConcatCTM()
16.2.6 陰影
xy偏移量定续、模糊值(blur)
16.2.6.1 陰影形成原理
RGB中默認(rèn)是黑色且透明度為1/3。
CGContextSetShadowWithColor()
16.2.6.2 繪制陰影
關(guān)閉陰影:恢復(fù)圖形狀態(tài)或顏色為NULL禾锤。
16.2.7 梯度
漸變:CGShadingRef和CGGradientRef私股,可以創(chuàng)建軸向或徑向漸變。
16.2.7.1 軸向和徑向漸變展示
16.2.7.2 CGGradient使用
CGGradient對(duì)象比CGShading對(duì)象更容易重用恩掷。因?yàn)闆]有存儲(chǔ)幾何形狀倡鲸,允許使用相同的顏色方案來(lái)繪制不同的幾何圖形。
16.2.7.3 CGShading對(duì)象的使用
1396
16.2.8 透明層
TransparencyLayers
通過(guò)組合兩個(gè)或多個(gè)對(duì)象來(lái)生成組合圖形黄娘。
16.2.8.1 工作機(jī)制
Quartz為每個(gè)上下文維護(hù)一個(gè)透明層棧峭状。
繪制完成后克滴,Quartz將結(jié)合對(duì)象放入上下文,并使用上下文的全局Alpha值宁炫、陰影狀態(tài)已裁減區(qū)域用于組合對(duì)象。
16.2.8.2 透明層中進(jìn)行繪制
幾個(gè)函數(shù)氮凝。
16.2.9 使用PDF文檔
16.2.9.1 打開查看PDF
CGPDFDocumentRef數(shù)據(jù)類型羔巢。
16.2.9.2 為PDF頁(yè)創(chuàng)建一個(gè)轉(zhuǎn)換
16.2.9.3 創(chuàng)建PDF文件
16.2.9.4 添加鏈接
16.2.9.5 保護(hù)PDF內(nèi)容
16.3 案例實(shí)戰(zhàn)
16.3.1 案例:繪制圖形
16.3.2 案例:繪制線條
16.3.3 案例:繪制文本
CGContextRef.
16.3.4 案例:繪制路徑
CGContextAddStar()可以畫五角星和三角形。
16.3.5 案例:繪制曲線
curve:曲線
quad curve:四邊形曲線
二元曲線:開始點(diǎn)罩阵、結(jié)束點(diǎn)竿秆、控制點(diǎn)
16.3.6 案例:設(shè)計(jì)畫板
16.4 小結(jié)
17 動(dòng)畫設(shè)計(jì)
OpenGL是一個(gè)跨平臺(tái)的、基于C語(yǔ)言的接口稿壁,可創(chuàng)建2D和3D內(nèi)容幽钢。
Core Animation 是一個(gè)用于圖形渲染、投影和動(dòng)畫OC類集合傅是,使創(chuàng)建動(dòng)畫的難度降低匪燕。
1447
17.1 OpenGL ES
是OpenGL的嵌入式系統(tǒng)版本,精簡(jiǎn)版本喧笔,專門為移動(dòng)設(shè)備設(shè)計(jì)帽驯。
適用于游戲或高幀率應(yīng)用。
17.1.1 OpenGL ES概述
OpenGL ES 1.x 是針對(duì)固定管線硬件的书闸。
OpenGL ES 2.x 針對(duì)可編程管線硬件尼变。
被廣泛推廣的原因:
- 行業(yè)標(biāo)準(zhǔn)和免稅版。
- 占用空間小和低耗能浆劲。嵌入式優(yōu)勢(shì)嫌术。
- 從軟件到硬件渲染的無(wú)縫連接。用于更高耗能設(shè)備的硬件加速牌借。
- 可擴(kuò)展和演變度气。
- 使用簡(jiǎn)單。
- 文件管理有序膨报。
17.1.2 配置上下文
上下文可以把每一種實(shí)現(xiàn)的狀況信息封裝在一起蚯嫌,容易使多個(gè)應(yīng)用共享圖形硬件,而不會(huì)干擾彼此的狀況丙躏。
EAGLContext對(duì)象择示。
17.1.2.1 上下文在線程中的配置
setCurrentContext:設(shè)置新的上下文時(shí),會(huì)釋放以前的上下文晒旅。
17.1.2.2 上下文和OpenGL ES版本
pipeline 來(lái)源于福特生產(chǎn)車間的流水線作業(yè)栅盲。
判斷初始化是否成功。
17.1.3 OpenGL ES繪制
創(chuàng)建幀緩存->渲染成影像
17.1.3.1 幀緩存的對(duì)象存儲(chǔ)渲染結(jié)果
framebuffer
測(cè)試幀緩存的完整性废恋。
renderbuffer 屏幕外的圖像處理谈秫。
17.1.3.2 離屏幀緩存對(duì)象
GLuint;
glGenFramebuffers;
glBindFramebuffer;
glRenderbufferStorage;
17.1.3.3 繪制到一個(gè)幀緩存對(duì)象
填充幀緩存對(duì)象扒寄。
17.2 OpenGL ES 應(yīng)用
17.2.1 項(xiàng)目的創(chuàng)建和設(shè)置
17.2.2 上下文的創(chuàng)建
EAGLContext
17.2.3 渲染緩存的創(chuàng)建
用于在屏幕上呈現(xiàn)的存儲(chǔ)渲染圖像的OpenGL對(duì)象。
renderbuffer 也稱為顏色緩存拟烫,因?yàn)閺谋举|(zhì)上來(lái)說(shuō)该编,使用其中存儲(chǔ)的顏色來(lái)顯示。
glGenRenderbuffers() 創(chuàng)建硕淑。
glBindRenderbuffer() 通知OpenGL课竣,每當(dāng)指向GL_RENDERBUFFER,就意味著傳遞給該對(duì)象置媳。
renderbufferStorage:
1468
17.2.4 幀緩存的創(chuàng)建
framebuffer:是一個(gè)包含一個(gè)渲染緩存和其他一下緩存(如一個(gè)深度緩存于樟、模板緩存和積累緩存)的OpenGL的對(duì)象。
創(chuàng)建過(guò)程和渲染緩存類似拇囊。
17.2.5 屏幕的清理
glClearColor迂曲、glClear、presentRenderbuffer
17.2.6 OpenGLView和app的委托關(guān)系
17.3 Core Animation
CoreAnimation把與視圖對(duì)象相關(guān)聯(lián)的層存儲(chǔ)在一個(gè)樹層結(jié)構(gòu)中寥袭,層樹中的每個(gè)層都有一個(gè)父類路捧,但可以嵌入任意數(shù)量的子層,而不需要同時(shí)添加相應(yīng)的視圖传黄,當(dāng)實(shí)現(xiàn)某種特殊的視覺效果鬓长,而又不需要在視圖上保持這種效果時(shí),可以使用該技術(shù)尝江。
CALayer對(duì)象涉波。
Core Animation額外維護(hù)兩組層對(duì)象,稱之為樹和渲染樹炭序。
17.3.1 層和變換
錨點(diǎn) anchorPoint
17.3.2 樹層結(jié)構(gòu)
17.3.3 層上下文和層行為
1485
明天再看一遍CA啤覆,今天沒看進(jìn)去。
17.3.4 動(dòng)畫
顯示動(dòng)畫惭聂,添加動(dòng)畫層并添加到層樹中窗声。
17.3.5 事務(wù)
每一個(gè)Layer的修改都會(huì)涉及一個(gè)事務(wù)transaction.
CATransaction,隱式事務(wù)和顯式事務(wù)。
顯示事務(wù):在同一時(shí)間對(duì)許多層的屬性進(jìn)行設(shè)置辜纲。
17.3.6 動(dòng)畫層布局
17.4 案例實(shí)戰(zhàn)
17.4.1 案例:設(shè)計(jì)過(guò)渡動(dòng)畫
CATransition過(guò)渡笨觅。控制UIView內(nèi)子控件過(guò)渡動(dòng)畫耕腾。
startProgress 開始進(jìn)度 endProgress 結(jié)束進(jìn)度见剩。
多種翻頁(yè)效果。
17.4.2 案例:設(shè)計(jì)屬性動(dòng)畫
CAPropertyAnimation控制:子類包括CABasicAnimation(只有開始和結(jié)束兩個(gè)信息)扫俺、CAKeyframeAnimation(指定多個(gè)信息)等
所有支持?jǐn)?shù)值型屬性值的屬性都可作為動(dòng)畫屬性苍苞。
17.4.3 案例:設(shè)計(jì)路徑動(dòng)畫
CAKeyframeAnimation通過(guò)path屬性指定CALayer的移動(dòng)路徑。
控制小魚轉(zhuǎn)圈。
17.5 小結(jié)
UIView由一個(gè)特殊的CoreAnimationLayer支持羹呵,為CAEAGLLayer對(duì)象骂际,是OpenGL ES 和 Core Animation聯(lián)系的橋梁。
18 多媒體開發(fā)
18.1 使用聲音
框架選擇:
AVFoundation:OC接口冈欢。
Audio Toolbox:解析音頻流歉铝、音頻格式轉(zhuǎn)換等。
Audio Unit:音頻處理插件凑耻。
OpenAL:在游戲和其他app中回放位置音頻太示。
MediaPlayer:播放iPod中的音頻。
CoreAudio框架
18.1.1 音頻編解碼
大多數(shù)音頻格式都支持基于軟件的編解碼拳话。出于性能的考慮先匪,要合適的使用硬解碼种吸,性能影響比軟解碼要小弃衍。
可以硬解碼的音頻格式。
不能通過(guò)硬解碼同時(shí)播放多個(gè)音頻坚俗。
PCM(無(wú)壓縮) IMA4(有壓縮)
18.1.2 音頻回放和錄制格式
iOS支持的音頻回放格式镜盯。
iOS支持的音頻錄制格式。
iOS如何支持單路或多路音頻格式猖败。
多路:共用同一個(gè)硬件路徑速缆,要采用硬編碼+軟編碼結(jié)合的方式。
1509
18.1.3 音頻會(huì)話
Core Audio能夠影響的行為恩闻。
范疇
中斷和路由變化
硬件特征
18.1.4 播放音頻
后臺(tái)播放
18.1.5 通過(guò)iPod媒體庫(kù)訪問(wèn)接口播放媒體項(xiàng)
18.1.6 使用系統(tǒng)聲音服務(wù)播放聲音及觸發(fā)震動(dòng)
18.1.7 通過(guò)AVAudioPlayer類輕松播放聲音
18.1.8 用音頻隊(duì)列服務(wù)播放和控制聲音
18.1.9 創(chuàng)建一個(gè)音頻隊(duì)列對(duì)象
18.1.10 控制回放音量
18.1.11 指示回放音量
18.1.12 同時(shí)播放多路聲音
18.1.13 使用OpenAL播放和定位聲音
控制游戲音頻艺糜。
18.1.14 錄制音頻
AVAudioRecorder
18.1.15 解析音頻流
網(wǎng)絡(luò)音頻流。
18.1.16 iOS系統(tǒng)上的音頻單元支持
18.1.17 iPhone音頻的最佳實(shí)踐
afconvert命令行工具進(jìn)行廣泛的音頻數(shù)據(jù)格式和文件類型轉(zhuǎn)換幢尚。
18.2 使用視頻
18.2.1 錄制視頻
UIImagePickerController對(duì)象破停。
18.2.2 播放視頻文件
MediaPlayer框架
MPMoviewPlayerController類。
18.3 案例實(shí)戰(zhàn)
18.3.1 案例:播放音效
18.3.2 播放音樂
AVAudioPlayer
18.3.3 案例:播放視頻
18.3.4 案例:錄制音頻
18.3.5 案例:錄制視頻
18.4 小結(jié)
19 設(shè)備管理
19.1 硬件檢測(cè)
19.2 配件通信
External Accessory框架尉剩,管道機(jī)制真慢。
1563
19.2.1 配件基礎(chǔ)
EASession類
NSInputStream和NSOutputStream對(duì)象。
19.2.2 聲明協(xié)議
info.plist中聲明支持的協(xié)議理茎。
19.2.3 連接配件
19.2.4 監(jiān)控配件
注冊(cè)通知黑界。
或遵守EAAccessory Delegate協(xié)議。
19.3 使用加速器
3個(gè)軸向皂林。
UIAccelerometer對(duì)象接收數(shù)據(jù)朗鸠。
數(shù)據(jù)更新的最小間隔為10毫秒,對(duì)應(yīng)于100HZ的刷新率础倍。
將代理設(shè)置為nil就會(huì)停止加速計(jì)事件童社。
靜止時(shí)數(shù)據(jù)會(huì)有輕微的波動(dòng),可以通過(guò)取平均值進(jìn)行調(diào)整著隆。
19.3.1 選擇更新頻率
選擇合適的更新頻率扰楼,技能滿足需求呀癣,又能提高電池壽命。
19.3.2 分離重力數(shù)據(jù)
低通濾波器算法:當(dāng)前濾波前數(shù)據(jù)的10%和前一個(gè)濾波后數(shù)據(jù)的90%
19.3.3 分離實(shí)時(shí)運(yùn)動(dòng)數(shù)據(jù)
高通濾波器算法:當(dāng)前加速計(jì)數(shù)據(jù)-低通濾波值
19.3.4 獲取設(shè)備方向
大體而非精確:UIDevice類的相關(guān)方法弦赖。
打開加速計(jì)硬件项栏,通過(guò)通知來(lái)獲取方向或手動(dòng)獲取。
關(guān)閉加速計(jì)蹬竖。
19.4 使用位置和方向
CoreLocation框架沼沈。
19.4.1 獲取當(dāng)前位置
控制在最小程度,比較耗電币厕,會(huì)像基站列另、Wi-Fi或GPS查詢。
對(duì)時(shí)間戳進(jìn)行檢驗(yàn)旦装,因?yàn)槲恢梅?wù)通常會(huì)立即返回最后緩存的位置事件页衙,得到一個(gè)大致的固定位置可能要花幾秒鐘的時(shí)間,更新之前的數(shù)據(jù)只是反映最后一次得到的數(shù)據(jù)阴绢。
位置請(qǐng)求返回的順序有時(shí)可能和時(shí)間戳指示的順序不同店乐。
19.4.2 獲取方向事件
兩種方法:
- 包含GPS硬件的設(shè)備可以提供大致信息,
- 包含磁力計(jì)的設(shè)備可以提供更精確的方向信息呻袭,CLHeading類
磁力計(jì)可以測(cè)量地球散發(fā)的磁場(chǎng)眨八,進(jìn)而確定設(shè)備的準(zhǔn)確方向。
Info.plist配置必須具有GPS和磁力計(jì)硬件左电。
19.5 使用地圖
MapKit
19.5.1 添加地圖視圖
19.5.2 縮放和移動(dòng)地圖
1584
19.5.3 顯示用戶當(dāng)前位置
19.5.4 坐標(biāo)和像素切換
地圖坐標(biāo)和視圖對(duì)象的本地坐標(biāo)系統(tǒng)轉(zhuǎn)換廉侧。
covertCoordinate:toPointToView:
19.5.5 顯示注解
注解是定義并放置在地圖上面的信息片段。
19.5.6 添加和移除注解對(duì)象
不應(yīng)直接在地圖上添加注解視圖篓足,而是應(yīng)該添加注解對(duì)象段誊。
19.5.7 定義注解視圖
MKAnnotationView
MKPinAnnotationView
19.5.8 創(chuàng)建注解視圖
復(fù)用。
19.5.9 處理注解視圖中的事件
19.5.10 獲取地標(biāo)信息
獲取與地圖坐標(biāo)相關(guān)聯(lián)的地標(biāo)信息纷纫,方便用戶理解枕扫。
MKReverseGeocoder類。
反地理編碼辱魁。
19.6 使用照相機(jī)
UIImagePickerController類烟瞧。
使用前確認(rèn)相機(jī)狀態(tài)是否可用。
19.7 使用照片庫(kù)
UIImagePickerControllerSourceTypePhotoLibrary
19.8 使用郵件
MFMailComposeViewController
19.9 案例實(shí)戰(zhàn)
19.9.1 案例:管理通信設(shè)備
UIApplication openURL:
19.9.2 案例:獲取加速度染簇、陀螺儀参滴、磁場(chǎng)數(shù)據(jù)
CMMotionManager
19.9.3 案例:獲取移動(dòng)數(shù)據(jù)
CMMotionManager返回的CMDeviceMotion對(duì)象
19.9.4 案例:獲取位置信息
CoreLocation框架,蜂窩基站锻弓、Wi-Fi信號(hào)砾赔、GPS信息。
19.9.5 案例:地圖定位
19.10 小結(jié)
20 文件和數(shù)據(jù)操作
20.1 文件操作
創(chuàng)建、刪除暴心、復(fù)制妓盲、剪切、粘貼专普。
一些原則悯衬。
20.1.1 iPhone常用目錄
Documents
Preferences
Caches
Tmp
20.1.2 獲取程序目錄路徑
如果使用帶有ANSI C編程接口的框架,可以將一個(gè)NSString對(duì)象強(qiáng)制轉(zhuǎn)換為一個(gè)CFStringRef類型檀夹。
NSSearchPathForDirectoriesInDomains()函數(shù)最初是為Mac OS X設(shè)計(jì)的筋粗,電腦可能存在多個(gè)這樣的目錄,所以返回一個(gè)路徑數(shù)組炸渡,而不是單一路徑娜亿,iOS中數(shù)組只包含一個(gè)特定路徑。
1627
20.1.3 文件更新
更新app時(shí)文件不會(huì)被移除:
<Application_Home>/Documents
<Application_Home>/Library/Preferences
其他目錄可能被保留蚌堵,也可能被刪除买决。
20.1.4 文件備份和恢復(fù)
iTunes自動(dòng)備份,<<<< 除了 >>>以下幾個(gè)目錄:
/AppName.app
/Library/Caches
/tmp
數(shù)據(jù)量大或頻繁變化的文件辰斋,應(yīng)該放在Caches目錄下策州,而不是Documents目錄瘸味。
20.2 數(shù)據(jù)讀寫
20.2.1 文件數(shù)據(jù)的讀寫
20.2.1.1 Foundation框架
- plist文件轉(zhuǎn)NSData
- NSCoding協(xié)議可以通過(guò)NSKeyedArchiver類
- NSFileHandle隨機(jī)訪問(wèn)
- NSFileManager創(chuàng)建和操作
20.2.1.2 Core OS調(diào)用
fopen宫仗、fread、fwrite
mmap旁仿、munmap
20.2.2 屬性列表數(shù)據(jù)的讀寫
plist文件
20.2.3 用歸檔器對(duì)數(shù)據(jù)進(jìn)行讀寫
將任意的對(duì)象集合轉(zhuǎn)換為字節(jié)流藕夫。
20.2.4 將數(shù)據(jù)寫到Documents目錄
20.2.5 從Documents目錄對(duì)數(shù)據(jù)進(jìn)行讀取
文件較大時(shí),應(yīng)該避免一次性地裝載整個(gè)文件枯冈,可以考慮使用mmap()函數(shù)或NSData的initWithContentsOfMappedFile:方法來(lái)將文件映射到內(nèi)存毅贮。
20.2.6 保存狀態(tài)信息
選擇合適的時(shí)機(jī)保存數(shù)據(jù)。
20.3 SQLite
包含在一個(gè)相對(duì)較小的C庫(kù)中尘奏,設(shè)計(jì)目標(biāo)時(shí)嵌入式的滩褥。占用資源非常低。
20.3.1 數(shù)據(jù)類型
SQLite時(shí)動(dòng)態(tài)類型
大部分關(guān)系型數(shù)據(jù)庫(kù)列的類型在創(chuàng)建表的時(shí)候就確定了炫加。
動(dòng)態(tài)類型瑰煎,會(huì)根據(jù)存入值自動(dòng)判斷,列的類型由值決定俗孝。
- NULL
- INTEGER
- REAL
- TEXT
- BLOB
20.3.2 常用函數(shù)及返回編碼
數(shù)據(jù)庫(kù)創(chuàng)建關(guān)閉類酒甸、
數(shù)據(jù)操縱語(yǔ)句類、
數(shù)據(jù)查詢填充語(yǔ)句類
20.3.3 操作數(shù)據(jù)庫(kù)
20.3.4 創(chuàng)建表
預(yù)處理和執(zhí)行創(chuàng)建赋铝。