1锥涕、LLVM(低級(jí)虛擬機(jī))的 Clang 編譯器來編譯 OC 程序
Clang(前端)-- LLVM(后端)
Clang: a C language family frontend for LLVM福贞;LLVM的C語言家族(C右犹、C++蛤铜、OC)前端。
LLVM 包含LLVM中介碼(LLVM IR)姚建、LLVM除錯(cuò)工具止状、LLVM C++標(biāo)準(zhǔn)庫(kù)等一套工具,和傳統(tǒng)底層虛擬機(jī)并沒什么關(guān)系。(LLDB 也是 LLVM 的一部分)
參考鏈接
2涂臣、OC 數(shù)據(jù)類型:
基本類型:整型食呻、字符型、浮點(diǎn)型(float嘶摊、double)、枚舉型
構(gòu)造類型:數(shù)組類型评矩、結(jié)構(gòu)體類型叶堆、共同體類型
指針類型
3、NSLog 輸出函數(shù)及格式字符
d 以帶符號(hào)的十進(jìn)制形式輸出的整數(shù)(正數(shù)不輸出符號(hào))
o 以八進(jìn)制無符號(hào)形式輸出的整數(shù)(不輸出0前綴)
x 以十六進(jìn)制無符號(hào)形式輸出的整數(shù)(不輸出0x前綴)
u 以無符號(hào)十進(jìn)制形式輸出的整數(shù)
c 以字符形式輸出斥杜,只輸出一個(gè)字符
s 輸出C風(fēng)格的字符串
f 以小數(shù)形式輸出浮點(diǎn)數(shù)虱颗,默認(rèn)輸出6位小數(shù)
e 以指數(shù)形式輸出浮點(diǎn)數(shù),數(shù)字部分默認(rèn)輸出6位小數(shù)
g 自動(dòng)選擇%f或%e其中之一蔗喂,保證輸出寬度較短的格式忘渔,并且不會(huì)輸出無意義的0
p 以十六進(jìn)制形式輸出變量所代表的地址值
@ 輸出objective-C的對(duì)象
NSLog() 函數(shù)支持的附加字符
l(字母)可在格式字符d、o缰儿、x畦粮、u之前,用于輸出長(zhǎng)整型整數(shù)返弹;也可以在f锈玉、e、g之前义起,用于輸出長(zhǎng)浮點(diǎn)型數(shù)
m(整數(shù)) 指定輸出數(shù)據(jù)所占的最小寬度
.n 對(duì)于浮點(diǎn)數(shù)拉背,表示輸出n位小數(shù),對(duì)于字符串默终,表示截取的字符個(gè)數(shù)
- 表示輸出的數(shù)值向左對(duì)齊(和m配合使用椅棺,相當(dāng)于負(fù)號(hào))
4犁罩、ANSI C
OC 不支持復(fù)雜的運(yùn)算,可以引入 ANSI C 的 <math.h>頭文件两疚,其中定義了很多復(fù)雜的數(shù)學(xué)計(jì)算函數(shù)
同時(shí)ANSI C 還提供了很多函數(shù)用于處理 C 字符串
5床估、原碼、反碼诱渤、補(bǔ)碼
參考鏈接
正整數(shù)的原碼丐巫、補(bǔ)碼、反碼都一樣勺美;
負(fù)數(shù)的反碼就是他的原碼除符號(hào)位外递胧,按位取反;
負(fù)數(shù)的補(bǔ)碼等于他的原碼自低位向高位赡茸,尾數(shù)的第一個(gè)‘1’及其右邊的‘0’保持不變缎脾,左邊的各位按位取反,符號(hào)位不變占卧。(只不過是補(bǔ)碼正好就等于反碼加1罷了遗菠。)
6、goto 語句:用于多層循環(huán)跳出
當(dāng)我們要從循環(huán)體內(nèi)跳出循環(huán)或忽略循環(huán)體剩下的語句時(shí)——如果只是跳出不帶嵌套的循環(huán)华蜒,或忽略不帶嵌套循環(huán)的剩下語句辙纬,可使用break或continue;但如果要從多層嵌套的內(nèi)層循環(huán)直接跳出外層循環(huán)友多,這就可以考慮使用goto語句牲平,或需要從多層循環(huán)的內(nèi)層循環(huán)中忽略本次循環(huán)的剩下語句,也可以考慮使用goto語句域滥。
在if語句中若是使用break或continue語句都只是作用于內(nèi)層循環(huán),不會(huì)影響外層循環(huán)蜈抓;而goto語句則連外層循環(huán)也跳過启绰。
7、值傳遞
函數(shù)的參數(shù)傳遞機(jī)制:值傳遞沟使,就是將實(shí)際參數(shù)值的副本傳入函數(shù)內(nèi)委可,而參數(shù)本身不會(huì)受到任何影響。
8腊嗡、存儲(chǔ)
- 動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配內(nèi)存的存儲(chǔ)方式着倾。(函數(shù)形參變量、非static的局部變量燕少、函數(shù)執(zhí)行的現(xiàn)場(chǎng)數(shù)據(jù)以及返回地址等)
- 靜態(tài)存儲(chǔ):程序運(yùn)行開始就分配固定內(nèi)存的存儲(chǔ)方式(全局變量卡者、static修飾的局部變量)
9、C 語言特性
- “&”:取地址運(yùn)算符
- “*” :取變量運(yùn)算符
10客们、assign , copy, strong, retain, weak, assign區(qū)別
- 1.是否開辟新的內(nèi)存
- 2.是否對(duì)地址有引用計(jì)數(shù)增加
可變變量中崇决,copy是重新開辟一個(gè)內(nèi)存材诽,strong,weak恒傻,assgin后三者不開辟內(nèi)存脸侥,只是指針指向原來保存值的內(nèi)存的位置,storng指向后會(huì)對(duì)該內(nèi)存引用計(jì)數(shù)+1盈厘,而weak睁枕,assgin不會(huì)。weak沸手,assgin會(huì)在引用保存值的內(nèi)存引用計(jì)數(shù)為0的時(shí)候值為空譬重,并且weak會(huì)將內(nèi)存值設(shè)為nil,assign不會(huì)罐氨,assign在內(nèi)存沒有被重寫前依舊可以輸出臀规,但一旦被重寫將出現(xiàn)奔潰
不可變變量中,因?yàn)橹当旧聿豢杀桓淖冋ひ琧opy沒必要開辟出一塊內(nèi)存存放和原來內(nèi)存一模一樣的值塔嬉,所以內(nèi)存管理系統(tǒng)默認(rèn)都是淺拷貝。其他和可變變量一樣租悄,如weak修飾的變量同樣會(huì)在內(nèi)存引用計(jì)數(shù)為0時(shí)變?yōu)閚il谨究。
容器本身遵守上面準(zhǔn)則,但容器內(nèi)部的每個(gè)值都是淺拷貝泣棋。
(當(dāng)NSString長(zhǎng)度小于10時(shí)不再遵循引用計(jì)數(shù)規(guī)則胶哲,Tagged Pointer技術(shù)對(duì)其進(jìn)行了優(yōu)化√侗玻基本意思就是默認(rèn)會(huì)將一些長(zhǎng)度小于10的字符串直接保存在指針上面鸯屿,下次創(chuàng)建相同值的時(shí)候直接用同一份拷貝,這樣既減少了一次指針到值的訪問把敢,又減少了一份內(nèi)存的占用寄摆。)
11、KVC 執(zhí)行機(jī)制
- ①優(yōu)先調(diào)用set<key>方法 如果有該方法 在setter 方法中完成設(shè)置
- ②當(dāng)沒有set方法時(shí)修赞,kvc機(jī)制會(huì)檢查+(bool)accessInstanceVariablesDirectly;是否返回YES婶恼。當(dāng)你重寫了該方法并且返回的時(shí)No時(shí) kvc機(jī)制會(huì)直接執(zhí)行setValue:forUndefinedKey:啊這樣做可以讓你的類不被別人使用kvc;
- ③一般情況開發(fā)者不會(huì)重寫+(bool)accessInstanceVariablesDirectly方法 所以kvc 會(huì)搜索有沒有名稱為<key>的成員變量柏副。無論是在.h還是在.m部分定義也無論是使用了什么訪問修飾符只要存在成員變量都可以對(duì)其成員變量進(jìn)行賦值勾邦。
- ④如果該類中沒有set,也沒有_成員變量割择,kvc機(jī)制會(huì)搜索_is<key>成員變量眷篇。
- ⑤如果該類還是沒有_ 也沒有_is kvc 會(huì)繼續(xù)搜索<key>,is<key>再給它們賦值。
- ⑥如果都不存在 系統(tǒng)將會(huì)執(zhí)行setValue:forUndefinedKey 拋出異常锨推。
12铅歼、私有方法
OC 不存在絕對(duì)隱藏的方法公壤,其他類只需要 performSelector 即可調(diào)用
13、KVO 使用場(chǎng)景
數(shù)據(jù)模型組件的狀態(tài)數(shù)據(jù)發(fā)生改變時(shí)椎椰,試圖組件可以動(dòng)態(tài)的更新自己厦幅。
- (1)KVO 是基于 runtime 機(jī)制實(shí)現(xiàn)的
- (2)當(dāng)一個(gè)對(duì)象(假設(shè)是person對(duì)象,對(duì)應(yīng)的類為 JLperson)的屬性值age發(fā)生改變時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)繼承自JLperson的類
NSKVONotifying_JLPerson,在這個(gè)類的 setAge 方法里面調(diào)用
[super setAge:age];
[self willChangeValueForKey:@"age"];
[self didChangeValueForKey:@"age"];
三個(gè)方法,而后面兩個(gè)方法內(nèi)部會(huì)主動(dòng)調(diào)用
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context方法,在該方法中可以拿到屬性改變前后的值.
14、多繼承
OC 嚴(yán)格說不支持多繼承慨飘,但并不代表他只有一個(gè)父類确憨。應(yīng)該是只有一個(gè)直接父類,但可以有無限多個(gè)間接父類瓤的。
15休弃、強(qiáng)制類型轉(zhuǎn)換
只是改變了該指針變量的編譯時(shí)類型,該變量所指向?qū)ο蟮膶?shí)際類型不會(huì)發(fā)生改變圈膏。
16塔猾、包裝類
- NSValue、 NSNumber :可以用于包裝 short稽坤、int丈甸、long、float尿褪、char睦擂、指針、對(duì)象id等數(shù)據(jù)項(xiàng)杖玲,這樣就可以塞進(jìn)集合中顿仇。
- NSInteger 、NSUInteger 摆马、CGFloat并不屬于包裝類
- 自動(dòng)裝箱生產(chǎn)的 NSNumber 不支持 ARC臼闻,但是不能把浮點(diǎn)型數(shù)賦值給 NSNumber 類型的變量。建議顯式生成 NSNumber 對(duì)象今膊。
17些阅、OC 反射機(jī)制
就是與運(yùn)行環(huán)境交互:直接通過 OC 源碼、通過NSObject 定義的方法進(jìn)行動(dòng)態(tài)編程斑唬、直接調(diào)用運(yùn)行時(shí)函數(shù)進(jìn)行動(dòng)態(tài)編程。
運(yùn)行狀態(tài)中黎泣,對(duì)于任意一個(gè)類恕刘,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象抒倚,都能夠調(diào)用它的任意一個(gè)方法褐着;這種動(dòng)態(tài)獲取的以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能就是反射機(jī)制.
18、動(dòng)態(tài)調(diào)用方法
- performSelector
- objc_msgSend
19托呕、自動(dòng)釋放
集合類如果不是用 alloc含蓉、new频敛、copy、mutableCopy創(chuàng)建的話馅扣,相當(dāng)于默認(rèn)創(chuàng)建了一個(gè)自動(dòng)釋放的對(duì)象斟赚。
20、OC 集合類和 C 數(shù)組
集合類和數(shù)組不太一樣差油,C 的數(shù)組元素既可以是基本數(shù)據(jù)類型拗军,也可以是對(duì)象,但是 OC 中的集合類(NSArray蓄喇、NSSet发侵、NSDictionary)只能保存對(duì)象類型。
21妆偏、NSSet 用 Hash 算法來存儲(chǔ)集合中的元素刃鳄,元素沒有索引且不能重復(fù)。
哈希算法歷史悠久钱骂,業(yè)界著名的哈希算法也有很多叔锐,比如 MD5、SHA罐柳。哈希算法是指將任意長(zhǎng)度的二進(jìn)制值串映射為固定長(zhǎng)度的二進(jìn)制值串掌腰,這個(gè)映射的規(guī)則就是哈希算法,而通過原始數(shù)據(jù)映射之后得到的二進(jìn)制值串就是哈希值张吉。有以下幾個(gè)特點(diǎn):
從哈希值不能反向推導(dǎo)出原始數(shù)據(jù)(所以哈希算法也叫單向哈希算法或單向散列函數(shù))齿梁。
對(duì)輸入數(shù)據(jù)非常敏感,哪怕原始數(shù)據(jù)只修改了一個(gè) Bit肮蛹,最后得到的哈希值也大不相同勺择。
散列沖突的概率要很小,對(duì)于不同的原始數(shù)據(jù)伦忠,哈希值相同的概率非常小省核。
哈希算法的執(zhí)行效率要盡量高效,針對(duì)較長(zhǎng)的文本昆码,也能快速地計(jì)算出哈希值气忠。
* NSCountedSet:可變,無序的不同對(duì)象集合赋咽,可能在集合中出現(xiàn)多次旧噪。(即使對(duì)象已多次添加到集合中,集合中中也只有一個(gè)對(duì)象實(shí)例)脓匿;繼承自NSMutableSet;
* NSOrderedSet:靜態(tài)的淘钟,有序的唯一對(duì)象集合,繼承自NSObject陪毡。(創(chuàng)建后無法修改集合內(nèi)容)米母;
* NSMutableOrderedSet:動(dòng)態(tài)的勾扭,有序的獨(dú)特對(duì)象集合,繼承自NSOrderedSet铁瞒。(創(chuàng)建后可修改集合內(nèi)容)妙色;
* NSIndexSet:是個(gè)無符號(hào)整數(shù)集合。集合中的元素不可變的精拟、不可重復(fù)燎斩。常被用來當(dāng)作索引使用。就從它字面上理解蜂绎,就叫做:索引集合栅表。
22、NSPointerArray师枣、NSHashTable怪瓶、NSMapTable實(shí)現(xiàn)對(duì)象的弱引用。
-
NSPointerArray:NSPointerArray效仿了NSArray(NSMutableArray)
- 和傳統(tǒng) Array 一樣践美,用于有序的插入或移除洗贰;
- 與傳統(tǒng) Array 不同的是,可以存儲(chǔ) NULL陨倡,并且 NULL 還參與 count 的計(jì)算敛滋;
- 與傳統(tǒng) Array 不同的是,count 可以 set兴革,如果直接 set count绎晃,那么會(huì)使用 NULL 占位;
- 可以使用 weak 來修飾成員杂曲;
- 成員可以是所有指針類型庶艾;
- 遵循 NSFastEnumeration,可以通過 for...in 來進(jìn)行遍歷擎勘。
-
NSHashTable:NSHashTable效仿了NSSet(NSMutableSet)咱揍,但提供了比NSSet更多的操作選項(xiàng),尤其是在對(duì)弱引用關(guān)系的支持上棚饵,NSHashTable在對(duì)象/內(nèi)存處理時(shí)更加的靈活煤裙。相較于NSSet,NSHashTable具有以下特性
- 1.NSHashTable是可變的噪漾,它沒有不可變版本积暖。
- 2.它可以持有元素的弱引用,而且在對(duì)象被銷毀后能正確地將其移除怪与。而這一點(diǎn)在NSSet是做不到的。
- 3.它的成員可以在添加時(shí)被拷貝缅疟。
- 4.它的成員可以使用指針來標(biāo)識(shí)是否相等及做hash檢測(cè)分别。
- 5.它可以包含任意指針遍愿,其成員沒有限制為對(duì)象。我們可以配置一個(gè)NSHashTable實(shí)例來操作任意的指針耘斩,而不僅僅是對(duì)象沼填。
-
NSMapTable:NSMapTable是更廣泛意義上的NSDictionary。和NSDictionary/NSMutableDictionary相比具有如下特性:
- 1.NSDictionary/NSMutableDictionary會(huì)復(fù)制keys并且通過強(qiáng)引用values來實(shí)現(xiàn)存儲(chǔ)括授;
- 2.NSMapTable是可變的坞笙;
- 3.NSMapTable可以通過弱引用來持有keys和values,所以當(dāng)key或者value被deallocated的時(shí)候荚虚,所存儲(chǔ)的實(shí)體也會(huì)被移除薛夜;
- 4.NSMapTable可以在添加value的時(shí)候?qū)alue進(jìn)行復(fù)制;
23版述、NSDictionary & NSSet
NSDictionary 的所有 key 放在一起其實(shí)就是一個(gè) NSSet 梯澜,但是調(diào)用 allKeys 返回的是 NSArray,可見是被處理過了渴析。
24晚伙、自定義 NSDictionary 的 key
- 重寫 isEqual 和 hash 方法
- 同時(shí)實(shí)現(xiàn)copyWithZone 方法
25、NSPredicate 與 NSRegularExpression
Predicates表示一個(gè)可以用來過濾對(duì)象集合的條件俭茧。通常咆疗,我們可以從 NSComparisonPredicate, NSCompoundPredicate, 和 NSExpression的實(shí)例直接創(chuàng)建predicates,但是母债,我們也可以從格式化的string來創(chuàng)建predicates午磁,這個(gè)格式化的string可以被NSPredicate的類方法解析,一般是正則表達(dá)式的string。通過 evaluateWithObject 系列的方法可以判斷條件是否符合场斑。
NSRegularExpression的基本匹配方法是一個(gè)Block迭代方法漓踢,可允許客戶端提供一個(gè)Block對(duì)象,來當(dāng)正則表達(dá)式匹配上目標(biāo)字符的一部分時(shí)漏隐,該Block塊被調(diào)用喧半。還有其他一些方便的方法,可以返回把所有匹配結(jié)果的數(shù)組青责,匹配的總數(shù)挺据,第一個(gè)匹配結(jié)果,第一個(gè)匹配的range脖隶。
26扁耐、使用 NSProcessInfo 可以用于獲取進(jìn)程相關(guān)的信息。
@interface NSProcessInfo : NSObject {
@private
NSDictionary *environment;
NSArray *arguments;
NSString *hostName;
NSString *name;
NSInteger automaticTerminationOptOutCounter;
}
@property (class, readonly, strong) NSProcessInfo *processInfo;
@property (readonly, copy) NSDictionary<NSString *, NSString *> *environment;
@property (readonly, copy) NSArray<NSString *> *arguments;
@property (readonly, copy) NSString *hostName;
@property (copy) NSString *processName;
@property (readonly) int processIdentifier;
@property (readonly, copy) NSString *globallyUniqueString;
27产阱、對(duì)象歸檔:可以看做就是序列化婉称。
方法一:普通方式實(shí)現(xiàn):
- (void)encodeWithCoder:(NSCoder *)coder
{
//告訴系統(tǒng)歸檔的屬性是哪些
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
//解檔
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeIntegerForKey:@"age"];
}
return self;
}
方法二:使用runtime方法實(shí)現(xiàn):
- (void)encodeWithCoder:(NSCoder *)coder
{
//告訴系統(tǒng)歸檔的屬性是哪些
unsigned int count = 0;//表示對(duì)象的屬性個(gè)數(shù)
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i = 0; i<count; i++) {
//拿到Ivar
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);//獲取到屬性的C字符串名稱
NSString *key = [NSString stringWithUTF8String:name];//轉(zhuǎn)成對(duì)應(yīng)的OC名稱
//歸檔 -- 利用KVC
[coder encodeObject:[self valueForKey:key] forKey:key];
}
free(ivars);//在OC中使用了Copy、Creat、New類型的函數(shù)王暗,需要釋放指針;诰荨!(注:ARC管不了C函數(shù))
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
//解檔
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i = 0; i<count; i++) {
//拿到Ivar
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
//解檔
id value = [coder decodeObjectForKey:key];
// 利用KVC賦值
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}
注:使用runtime的好處不言而喻俗壹,無論對(duì)象有多少屬性都可以通過這個(gè)for循環(huán)搞定科汗,非常棒。
28绷雏、最初的 MVC 模式是針對(duì)相同的數(shù)據(jù)需要不同顯示的應(yīng)用而設(shè)計(jì)的头滔, MVC 思想非常類似于一個(gè)觀察者模式,但手寫 UI 代碼其實(shí)是有點(diǎn)違背 MVC 思想的涎显。
29坤检、自定義 UI 控件,可以通過重寫 UIView 的一系列方法實(shí)現(xiàn)棺禾。
- 新建一個(gè)繼承UIView的類
- 在剛剛新建類的類擴(kuò)展中添加子控件屬性(用weak聲明缀蹄,防止內(nèi)存泄露)
- 在initWithFrame:方法中添加子控件
- 在layoutSubviews方法中設(shè)置子控件的frame(在該方法中一定要調(diào)用[super layoutSubviews]方法)
- 提供一個(gè)模型屬性,重寫模型屬性的set方法
- 在該setter方法中取出模型屬性膘婶,給對(duì)應(yīng)的子控件賦值
30缺前、UI 控件分為:
- 活動(dòng)控件:繼承與 UIControl 可以與用戶進(jìn)行交互、
- 靜態(tài)控件:只繼承于 UIView 只顯示不交互悬襟、被動(dòng)控件:文本框衅码。 (UIControl 繼承于 UIView )
31、拖動(dòng)條 UISlider
這個(gè)值是介于滑塊的最大值和最小值之間的脊岳,如果沒有設(shè)置邊界值逝段,默認(rèn)為0-1;
@property(nonatomic) float value;
設(shè)置滑塊最小邊界值(默認(rèn)為0)
@property(nonatomic) float minimumValue;
設(shè)置滑塊最大邊界值(默認(rèn)為1)
@property(nonatomic) float maximumValue;
設(shè)置滑塊最左端顯示的圖片:
@property(nonatomic,retain) UIImage *minimumValueImage割捅;
設(shè)置滑塊最右端顯示的圖片:
@property(nonatomic,retain) UIImage *maximumValueImage;
設(shè)置滑塊值是否連續(xù)變化(默認(rèn)為YES),這個(gè)屬性設(shè)置為YES則在滑動(dòng)時(shí)奶躯,其value就會(huì)隨時(shí)變化,設(shè)置為NO亿驾,則當(dāng)滑動(dòng)結(jié)束時(shí)嘹黔,value才會(huì)改變。
@property(nonatomic,getter=isContinuous) BOOL continuous;
設(shè)置滑塊左邊(小于部分)線條的顏色
@property(nonatomic,retain) UIColor *minimumTrackTintColor莫瞬;
設(shè)置滑塊右邊(大于部分)線條的顏色
@property(nonatomic,retain) UIColor *maximumTrackTintColor儡蔓;
設(shè)置滑塊顏色(影響已劃過一端的顏色)
注意這個(gè)屬性:如果你沒有設(shè)置滑塊的圖片,那個(gè)這個(gè)屬性將只會(huì)改變已劃過一段線條的顏色疼邀,不會(huì)改變滑塊的顏色喂江,如果你設(shè)置了滑塊的圖片,又設(shè)置了這個(gè)屬性旁振,那么滑塊的圖片將不顯示获询,滑塊的顏色會(huì)改變(IOS7)
@property(nonatomic,retain) UIColor *thumbTintColor涨岁;
手動(dòng)設(shè)置滑塊的值:
- (void)setValue:(float)value animated:(BOOL)animated;
設(shè)置滑塊的圖片:
- (void)setThumbImage:(UIImage *)image forState:(UIControlState)state;
設(shè)置滑塊劃過部分的線條圖案
- (void)setMinimumTrackImage:(UIImage *)image forState:(UIControlState)state;
設(shè)置滑塊未劃過部分的線條圖案
- (void)setMaximumTrackImage:(UIImage *)image forState:(UIControlState)state;
對(duì)應(yīng)的幾個(gè)get方法
- (UIImage *)thumbImageForState:(UIControlState)state;
- (UIImage *)minimumTrackImageForState:(UIControlState)state;
- (UIImage *)maximumTrackImageForState:(UIControlState)state;
對(duì)應(yīng)的設(shè)置當(dāng)前狀態(tài)的響應(yīng)屬性的方法
@property(nonatomic,readonly) UIImage* currentThumbImage;
@property(nonatomic,readonly) UIImage* currentMinimumTrackImage;
@property(nonatomic,readonly) UIImage* currentMaximumTrackImage;
添加觸發(fā)事件
[slider addTarget:self action:@selector(log:) forControlEvents:UIControlEventValueChanged];
32、微調(diào)器 UIStepper
如果我們的需求是點(diǎn)住 "+" 或者 "-"按鈕筐付,數(shù)量就一直遞增遞減的話卵惦, btn-label-btn的方式來做可能就不太好用了,使用 UIStepper 可以很方便的實(shí)現(xiàn)這個(gè)功能,只是 UI 可能需要自定義一下瓦戚。
33、應(yīng)用啟動(dòng)過程丛塌,application 各個(gè)方法調(diào)用順序
34较解、程序被中斷時(shí)(電話進(jìn)來)應(yīng)該做什么處理
停止timer 和其他周期性的任務(wù)
停止任何正在運(yùn)行的請(qǐng)求
暫停視頻的播放
如果是游戲那就暫停它
減少OpenGL ES的幀率
掛起任何分發(fā)的隊(duì)列和不重要的操作隊(duì)列(你可以繼續(xù)處理網(wǎng)絡(luò)請(qǐng)求或其他時(shí)間敏感的后臺(tái)任務(wù))。
當(dāng)程序回到active狀態(tài) 赴邻, applicationDidBecomeActive: 方法應(yīng)該上面提到的任務(wù)重新開始印衔,比如重新開始timer, 繼續(xù)分發(fā)隊(duì)列,提高OpenGL ES的幀率姥敛。不過游戲要回到暫停狀態(tài)奸焙,不能自動(dòng)開始。
35彤敛、Quartz 2D 繪圖基礎(chǔ):CGContextRef, 同時(shí)也可以用于繪制文本
Quartz2D 蘋果封裝的一套繪圖的函數(shù)庫(kù)与帆,同時(shí)支持iOS和Mac. UIKit框架,里面有各種各樣的UI控件,其實(shí)大部分控件的內(nèi)容都是通過Quartz2D畫出來的
Quartz2D能做什么?
繪制圖形 : 線條墨榄、三角形玄糟、矩形、圓袄秩、弧等
繪制文字
繪制阵翎、生成圖片(圖像)
讀取、生成PDF
截圖之剧、裁剪圖片
自定義UI控件
涂鴉郭卫、畫板
手勢(shì)解鎖
.........
iOS中常用的是截屏、裁剪背稼、自定義UI控件
與直接在UIView控件上繪圖不同贰军,在內(nèi)存中繪圖時(shí),需要開發(fā)者自己準(zhǔn)備繪圖環(huán)境雇庙,Quartz 2D提供了一個(gè)非常便捷的函數(shù):UIGraphicsBeginImageContext(CGSize size)谓形,該函數(shù)用于準(zhǔn)備繪圖環(huán)境。當(dāng)圖形繪制完成后疆前,可調(diào)用UIGraphicsEndImageContext()函數(shù)結(jié)束繪圖和關(guān)閉繪圖環(huán)境寒跳。不需要在drawRect 方法中了,可以提高性能竹椒。
總結(jié)來說童太,在內(nèi)存中繪圖的步驟如下:
調(diào)用UIGraphicsBeginImageContext(CGSize size)函數(shù)準(zhǔn)備繪圖環(huán)境。
調(diào)用UIGraphicsGetCurrentContext()函數(shù)獲取繪圖CGContextRef。
用前面介紹的繪制集合圖形书释、使用路徑等方式進(jìn)行繪圖翘贮。
調(diào)用UIGraphicsGetImageFromCurrentImageContext()函數(shù)獲取當(dāng)前繪制的圖形,該方法返回一個(gè)UIImage對(duì)象爆惧。
調(diào)用UIGraphicsEndImageContext()函數(shù)結(jié)束繪圖狸页,并關(guān)閉繪圖環(huán)境。
36扯再、Core Image 濾鏡芍耘,可以創(chuàng)建基于 CPU 、GPU 熄阻、OpenGL 的 CIContext 對(duì)象斋竞,用于處理圖片。
1.框架介紹
(1)CoreImage
(2)是一個(gè)圖片框架
它基于OpenGL頂層創(chuàng)建
底層則用著色器來處理圖像
(3)他利用了GPU基于硬件加速來處理圖像
(4)CoreImage中有很多濾鏡
(5)它們能夠一次給予一張圖像或者視頻幀多種視覺效果 -> 濾鏡鏈
(6)而且濾鏡可以連接起來組成一個(gè)濾鏡鏈 把濾鏡效果疊加起來處理圖像
2.類的介紹
1.CIImage 保存圖像數(shù)據(jù)的類
CGImageRef->圖像中的數(shù)據(jù)
2.CIFilter 濾鏡類
圖片屬性進(jìn)行細(xì)節(jié)處理的類
它對(duì)所有的像素進(jìn)行操作 用鍵-值(KVC)來設(shè)置
3.CIContext 上下文是實(shí)現(xiàn)對(duì)圖像處理的具體對(duì)象 用來把濾鏡和圖片合成成為一張圖片 濾鏡對(duì)象輸出的圖像并不是合成之后的圖像秃殉,需要使用圖片處理的上下文 合并輸出圖像
37坝初、Quartz Corec 可以用于控制動(dòng)畫。
iOS設(shè)備給用戶視覺反饋其實(shí)都是通過QuartzCore框架來進(jìn)行的钾军,說白了鳄袍,所有用戶最終看到的顯示界面都是圖層合成的結(jié)果,而圖層即是QuartzCore中的CALayer巧颈。
通常我們所說的視圖即UIView畦木,并不是直接顯示在屏幕上,而是在創(chuàng)建視圖對(duì)象的時(shí)候視圖對(duì)象會(huì)自動(dòng)創(chuàng)建一個(gè)層砸泛,而視圖對(duì)象把要顯示的東西繪制在層上十籍,待到需要顯示時(shí)硬件將所有的層拷貝,然后按Z軸的高低合成最終的顯示結(jié)果唇礁。
CALayer本質(zhì)上是一塊包含一幅位圖的緩沖區(qū)勾栗,由視圖創(chuàng)建的層為隱式層,而手動(dòng)創(chuàng)建的層稱為顯示層盏筐。
如果要在iOS上能夠有良好的用戶體驗(yàn)围俘,動(dòng)畫的過渡效果是必不可少的,而所有的動(dòng)畫效果都是通過CAAnimation類的子類(CAAnimation是抽象類)來完成的琢融。CAAnimation類的子類包括了CAAnimationGroup,CAPropertyAnimation,CATransition界牡,而CAPropertyAniamtion(同為抽象類)也衍生了CABasicAnimation和CAKeyframeAnimation。用UIView的animation實(shí)現(xiàn)的動(dòng)畫本質(zhì)上也是通過CALayer來實(shí)現(xiàn)的漾抬,iOS系統(tǒng)中CALayer的很多屬性都是隱含有動(dòng)畫效果的宿亡,如果不想要隱式動(dòng)畫或者想要顯示動(dòng)畫效果,都可以通過CATransaction來設(shè)置是否顯示動(dòng)畫效果纳令。同時(shí)挽荠,在CATransaction內(nèi)可同時(shí)修改多個(gè)屬性克胳,然后再一并同時(shí)渲染,另外CATransaction還是可嵌套的圈匆。