OC通過一套全新的語法,在C語言的基礎(chǔ)上添加了面向?qū)ο蟮奶匦浴?br>
消息結(jié)果與函數(shù)調(diào)用區(qū)別在于:使用消息結(jié)構(gòu)的語言,其運(yùn)行時(shí)執(zhí)行的代碼由運(yùn)行環(huán)境來決定炉旷;而使用函數(shù)調(diào)用的語言,則由編譯器來決定。(函數(shù)調(diào)用的方式也提供了動(dòng)態(tài)綁定窘行,那就是多態(tài))
編譯期沒有計(jì)算偏移量饥追,運(yùn)行時(shí)把每個(gè)類加載進(jìn)內(nèi)存,每個(gè)屬性和方法都存在于映射表中罐盔。正是因?yàn)檫@個(gè)機(jī)制但绕,所以分類和運(yùn)行時(shí)編程才誕生。
UIAlertView增加參數(shù)可以通過翘骂,運(yùn)行時(shí)關(guān)聯(lián)屬性來達(dá)到目的壁熄。(變量或者block)
但是這種不好,最好還是用繼承的方式增加屬性碳竟。
第四條:少用預(yù)處理指令
static const NSTimeInterval kAnimationDuration = 0.3;
類全局變量的static修飾符作用域是編譯單元內(nèi);不加狸臣,編譯器為他建一個(gè)外部符號(hào)莹桅,另一個(gè)編譯單元同名會(huì)沖突。實(shí)際上static+const烛亦,編譯器不會(huì)建符號(hào)诈泼,直接替換。
函數(shù)內(nèi)的static作用域在函數(shù)內(nèi)煤禽,但是存在于全局變量區(qū)會(huì)記錄上次值铐达。
類中的static函數(shù)只能本類調(diào)用,所以不會(huì)生成符號(hào)表檬果,利于反編譯瓮孙。
作用域?yàn)檎麄€(gè)工程的全局符號(hào)
// EOCAnimatedView.h
extern const NSTimeInterval EOCAnimatedViewAnimationDuration;
// EOCAnimatedView.m
const NSTimeInterval EOCAnimatedViewAnimationDuration = 0.3;
第五條:枚舉的善用
NS_ENUM 全部情況
NS_OPTIONS 各種選項(xiàng),可以自由組合
枚舉用switch進(jìn)行分之判斷的時(shí)候选脊,別用default分之杭抠。這樣的話,增加一個(gè)狀態(tài)恳啥,編譯器會(huì)報(bào)警告偏灿。
第十二條:消息轉(zhuǎn)發(fā)機(jī)制
方法列表找不到
+ (BOOL)resolveInstanceMethod:(SEL)selector
+ (BOOL)resolveClassMethod:(SEL)selector
選擇其他接受者
- (id)forwardingTargetForSelector:(SEL)selector
轉(zhuǎn)發(fā)其他接受者
- (void)forwardInvocation:(NSInvocation*)invocation
第二十七條:匿名類隱藏實(shí)現(xiàn)細(xì)節(jié)
頭文件中引入了C++文件,會(huì)造成這個(gè)類被編譯成C++文件钝的。如果別人再引入這個(gè)文件翁垂,影響的范圍會(huì)很大。
所以引入C++文件的時(shí)候硝桩,把他放在.m文件中沿猜,這樣編譯的時(shí)候就只會(huì)影響自身。
頭文件的屬性只讀亿柑,匿名類可以修改成可寫邢疙。
對象關(guān)聯(lián)
把對象本身當(dāng)做字典,把關(guān)聯(lián)到對象的屬性理解為key。但是這個(gè)key是不透明的指針疟游,后面如果需要取出這個(gè)key的值呼畸,我們需要用到這個(gè)key,所以把key定義為靜態(tài)全局變量颁虐。
- (void)setCyj:(NSString *)cyj
{
objc_setAssociatedObject(self,@selector(cyj),cyj,OBJC_ASSOCIATION_COPY_NONATOMIC);
//關(guān)聯(lián)的key是getter方法的消息蛮原,所以getter方式的key可以直接是cmd
}
- (NSString *)cyj
{
return objc_getAssociatedObject(self, _cmd);
}
GCD
1、可以用串行隊(duì)列代替互斥鎖
_syncQueue = dispatch_queue_create("com.effectiveobjectivec.syncQueue", NULL);
- (NSString*)someString {
__block NSString *localSomeString;
dispatch_sync(_syncQueue, ^{
localSomeString = _someString;
});
return localSomeString;
}
- (void)setSomeString:(NSString*)someString {
dispatch_sync(_syncQueue, ^{
_someString = someString;
});
}
寫操作的可以用同步或者異步另绩,但是異步會(huì)是copy一份block內(nèi)容儒陨,所以在copy的消耗和執(zhí)行時(shí)間的消耗之間選擇。
2笋籽、并行隊(duì)列
_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
如果需要隊(duì)列元素單獨(dú)執(zhí)行蹦漠,可以使用柵欄
void dispatch_barrier_async(dispatch_queue_t queue,dispatch_block_t block);
void dispatch_barrier_sync(dispatch_queue_t queue,dispatch_block_t block);
3、GCD 比 performSelector 好车海,因?yàn)閜erformSelector 傳遞的參數(shù)很局限笛园,而且ARC內(nèi)存釋放也做不到。
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
[self doSomething];
});
4侍芝、GCD 和 操作隊(duì)列
GCD是純C的API研铆,操作隊(duì)列是在GCD上封裝的OC。
操作隊(duì)列好處:1.可以取消某個(gè)操作州叠。2.指定元素之間的依賴關(guān)系棵红。3.KVO監(jiān)測NSOperation的屬性。4.指定優(yōu)先級(jí)咧栗。