前言
該部分篇章懂牧,將會比較碎侈净。主要用于記錄自己開發(fā)和書籍中看到比較有價(jià)值的知識點(diǎn)的記錄和歸納。
Objective-C語言
一僧凤、關(guān)于OC語言
OC語言采用的是“消息結(jié)構(gòu)”而非“函數(shù)調(diào)用”畜侦。是由Smalltalk演化而來。
二者的關(guān)鍵差別是:消息結(jié)構(gòu)的語言拼弃,其運(yùn)行時所應(yīng)該執(zhí)行的代碼由運(yùn)行環(huán)境來決定夏伊,運(yùn)行時才會去查找需要執(zhí)行的方法;
函數(shù)調(diào)用語言吻氧,則有編譯器決定溺忧,運(yùn)行時按照“虛方法表”來查出到底要執(zhí)行那個函數(shù)。
OC是C的“超集”(superset)
OC的聲明比如:NSString* ptr; 抓喲是為了所有的對象所在控件都必須分配在堆空間而不是椂⑺铮空間鲁森。(結(jié)合C中malloc, alloc就比較好理解這一點(diǎn))
在C里面棧空間可以自動清理振惰,出棧之后將自動回收歌溉。而堆空間則是手動的調(diào)用free方法。 而OC將對象放置在堆中骑晶,采用的是引用計(jì)數(shù)的方法來管理內(nèi)存痛垛。MRC中提到所謂的“黃金法則”。
OC中除了基本的int, char ,double等使用的是椡盎祝空間匙头,其中CoreGraphics使用的也是,比如CGRect實(shí)質(zhì)就是C語言中的結(jié)構(gòu)體仔雷。
總之蹂析,OC是在C語言的基礎(chǔ)上添加了面向?qū)ο蟮奶匦裕瑸槠涑拧C使用動態(tài)半丁的消息結(jié)構(gòu)电抚,在運(yùn)行時才會檢查對象的類型。接收到一條消息以后竖共,究竟應(yīng)該執(zhí)行何種代碼取決于運(yùn)行期的環(huán)境而非編譯環(huán)境蝙叛。
向前聲明(forward declaring)
@class Person
這樣可以減少類的使用者所需引入的頭文件數(shù)量」可以減少編譯習(xí)慣只有在真正需要的地方甥温,才有真正需要的使用才引入頭文件锻煌。一般來說在類的。h中使用向前聲明姻蚓,在.m中使用#import宋梧。來盡可能的降低類之間的耦合。
如果無法使用向前聲明狰挡,比如要繼承和協(xié)議部分捂龄,盡量把“該類遵守”的這條聲明移到"class-continuation分類"中。如果不行加叁,就把協(xié)議單獨(dú)放在一個頭文件中倦沧,然后將其引入。
二它匕、字面量
NSNumber* someNumber = @'a';
NSArray* animals = @[@"cat", @"dog"];
NSDictionary* personData = @{@"name": @"Marry", @"age": @28};
注意點(diǎn)
1.關(guān)于nil
NSArray* tempArray0 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];
NSArray* tempArray1 = @[obj1, obj2, obj3, obj4];
如果obj2為nil,那么tempArray0 (obj1) tempArray1執(zhí)行的時候?qū)挟惓U谷凇Uf明nil不能被加入Array中,所以字面量更加安全豫柬。字典雷同告希。
2.可變數(shù)組和字典的處理限制性的處理
NSMutableArray* mutable = [@[@1, @2, @3, @4] mutableCopy];
三、C語言中宏在OC中的使用
完全可以用烧给,因?yàn)镺C是C的超集燕偶,但是要少用。應(yīng)該多用類型常量來替代础嫡。
關(guān)于類型常量
如果只是在本類中使用指么,那么請?jiān)趯?shí)現(xiàn)文件中定義,并在前面加上字母k,如果常量在類以外可見榴鼎,那么使用類名作為前綴伯诬。OC沒有命名空間的蓋簾,所以最好用類名來區(qū)分巫财。
編譯單元里面的類型常量
static const NSTimeInterval kDuration = 0.3;
@implementation EOCAnimatedView
...
@end加static限定了其的使用范圍盗似,外部被引用會編譯報(bào)錯,不添加默認(rèn)會修飾為extern,而且修飾static也可以規(guī)避比如另外一個類,也聲明了一個kDuration導(dǎo)致重復(fù)聲明的錯誤翁涤。
const保證不會被改變桥言,試圖被修改將會報(bào)錯萌踱。
外界常量
//.h中
extern NSString* const EOCStringConstant;
//.m中
NSString* const EOCStringConstant = @"VALUE";
四葵礼、枚舉類型
在OC中和C語言一樣應(yīng)該多使用枚舉類型。
OBJC_ENUM(NSInteger, WIFIStatus){
DisConnected,
Connecting,
Connected
};
//主要用于單一枚舉的展示
OBJC_OPTIONS(NSInteger, FoodType){
Fruir = 1 << 0,
Vegetable = 1 << 1,
};
//主要用于可以疊加存在的情況并鸵,可以使用對應(yīng)的'|'和'&'來操作鸳粉。
注意點(diǎn):
當(dāng)使用枚舉的時候,遇到switch就別寫default來方便編譯器把未知的類型园担,通知到開發(fā)者届谈。