2018-07-29

MVC,MVVM

M<--->C<--->V
M<--->VM<--->V
VM負責的部分 將 model里屬性值 部分,處理成view顯示的部分,同時兼顧從網(wǎng)絡(luò),資源庫等地方獲取數(shù)據(jù),view部分不直接和model產(chǎn)生關(guān)系,自負責利用viewmodel 暴露的方式,接口來獲取顯示的內(nèi)容

KVO

原理 重寫子類set方法
在valueWillChange和valueDidChange之間,調(diào)用父類set方法改變屬性值,然后通過obver....回調(diào)方法通知監(jiān)聽者被監(jiān)聽的屬性發(fā)生改變
在NSOperation 中修改isFinish 來手動調(diào)用kvo的valueWillChange和valueDidChange來實現(xiàn)對隊列任務(wù)的控制 詳解
自定義 kvo
自定義通知

Runtime

swizzle 原理
每一個方法 Method 是結(jié)構(gòu)體包含著 sel(方法編號選擇器) IMP 方法指針
通過sel找到對應(yīng)的imp 通過imp去調(diào)用具體的方法
swizzle 是將sel對應(yīng)的imp進行交換, 假設(shè)系統(tǒng)中是selector1 對應(yīng) imp1 我們自定義的是selector2 對用的 imp2 通過method_exchangeImplemetation(Method m1,Method m2)將 selector1 指向imp2 selector2指向imp1
添加方法
class_addMethod(class, origSelector,method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));

此方法要寫在+load里 原因,+load方法是在類加載時候調(diào)用,執(zhí)行較早,系統(tǒng)調(diào)用,唯一性,不用擔心資源搶奪問題
調(diào)動未實現(xiàn)的方法會發(fā)生crash,補救措施(objc_msgForward,是用于消息轉(zhuǎn)發(fā)的:當向一個對象發(fā)送一條消息虏冻,但它并沒有實現(xiàn)的的候元潘,_objc_msgForward會嘗試做消息轉(zhuǎn)發(fā)鲫咽。)
1 首先會調(diào)用 +(BOOL)resolveInstanceMethod 或者+(BOOL)resolveClassMethod 方法 允許動態(tài)添加未實現(xiàn)的方法,進行補救.只要沒有通過class_addMethod添加對應(yīng)的方法,就會進行下一步,eg:

+(BOOL)resolveInstanceMethod:(SEL)sel{
   BOOL isFinish = [super resolveInstanceMethod:sel];
    if (sel ==  NSSelectorFromString(@"testsss")) {
        class_addMethod([self class], sel, (IMP)sss, "v@:");
       isFinish = YES;
    }
   return isFinish;
}

2 調(diào)用-(id)forwardingTagetForselector ,嘗試找到一個能響應(yīng)該消息的對象坷衍。如果獲取到撇吞,直接返回該對象 eg:

-(id)forwardingTargetForSelector:(SEL)aSelector{
    if(aSelector == NSSelectorFromString(@"test"))
    Class class = NSClassFromString(@"Test"); 
    return class;
}
return nil;
}

3 調(diào)用methodSigntureForSelector 嘗試獲得一個方法簽名酒甸。如果獲取不到浮声,則直接調(diào)用doesNotRecognizeSelector拋出異常虚婿。如果能獲取,則返回該方法簽名 eg:

if (aSelector == NSSelectorFromString(@"test")) {
        Class class = NSClassFromString(@"Test");
        return [NSMethodSignature signatureWithObjCTypes:method_getTypeEncoding(class_getInstanceMethod(class, aSelector))];
 }

4 調(diào)用forwardInvocation:方法 利用第三步返回的方法簽名,通過NSInvocation 實現(xiàn)對應(yīng)的方法 eg:

-(void)forwardInvocation:(NSInvocation *)anInvocation{
    Class class = NSClassFromString(@"Test");
    [anInvocation invokeWithTarget:[[class alloc] init]];
}

GCD

線程之間的通信

 [self performSelectorOnMainThread:@selector(dothing:) withObject:@[@"1"] waitUntilDone:YES];
 [self performSelector:@selector(dothing:) onThread:thread withObject:nil waitUntilDone:YES];

同步任務(wù): 優(yōu)先級高泳挥,在線程中有執(zhí)行順序然痊,不會開啟新的線程
異步任務(wù): 優(yōu)先級低,在線程中執(zhí)行沒有順序屉符,看cpu閑不閑剧浸。在主隊列中不會開啟新的線程锹引,其他隊列會開啟新的線程,(串行開啟一條線程,并行開啟多條線程)
隊列分為 [串行隊列] 和 [并行隊列] :
串行隊列:隊列中的線程按順序執(zhí)行(不會同時執(zhí)行)
并行隊列:隊列中的線程會并發(fā)執(zhí)行(同時執(zhí)行
串行與并行針對的是隊列,而同步與異步唆香,針對的則是線程
多個請求完成后統(tǒng)一刷新頁面 ,思路:利用group,創(chuàng)建任務(wù)組
通過 dispach_group_enter,通知任務(wù)進入group中,通過dispach_group_leave 通知任務(wù)完成離開group,最后通過dispach_group_notify來通知主線程刷新頁面,eg:

NSURLSession *session = [NSURLSession sharedSession];
    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_enter(dispatchGroup); 
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"任務(wù)1完成");
        dispatch_group_leave(dispatchGroup);
    }];
    [task resume];
    dispatch_group_enter(dispatchGroup);
    NSURLSessionDataTask *task2 = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"任務(wù)2完成");
        dispatch_group_leave(dispatchGroup);
    }];
    [task2 resume];
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
        NSLog(@"end");
    });
}
 dispatch_group_t group = dispatch_group_create();
    NSMutableArray *arr = [NSMutableArray array];
    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
    for (NSInteger i = 0; i<20; i++) {
        dispatch_group_async(group, queue, ^(){
            dispatch_group_enter(group);
            NSLog(@"請求%zd",i);
            sleep(3);
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                [arr addObject:@(i)];
                dispatch_group_leave(group);
            });
        });
        
    }
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"%zd",arr.count);
    });

內(nèi)存管理

SQL

網(wǎng)絡(luò)層通訊

4層網(wǎng)絡(luò)結(jié)構(gòu)
應(yīng)用層(http) 傳輸層(TCP,UDP) 網(wǎng)絡(luò)層(IP協(xié)議) 數(shù)據(jù)鏈路層(網(wǎng)絡(luò)傳輸,路由中轉(zhuǎn))
tcp/udp區(qū)別
tcp建立連接3次握手,斷開連接4次握手,安全穩(wěn)定不會丟包,適合數(shù)據(jù)量大的情況,速度較慢
udp不需要建立連接直接傳輸,速度快,但不穩(wěn)定,容易發(fā)生丟包的問題
http/https區(qū)別

Cocoapods

install和update 區(qū)別
需要增加或移除某一個或多個pods時嫌变,需要使用pod install
1.每一次執(zhí)行pod install命令-下載安裝新的pods-每一個pod的版本都會被記錄在Podfile.lock文件中。這個文件追蹤每個pod的安裝版本并且將它鎖定
2.使用pod install時躬它,它只是解決了之前未列入Podfile.lock的文件中的pods的依賴關(guān)系腾啥。
對于那些已經(jīng)出現(xiàn)在Podfile.lock文件中的pods,它只會下載該文件中指定版本的pod冯吓,并不會去檢索是否存在新的版本
對于Podfile.lock文件中還沒有鎖住版本的新增pod倘待,它會按照Podfile文件中描述的方式去搜索匹配的版本
需要更新這個pods的版本時,需要使用pod update
CocoaPods會去找到指定PODNAME的更新组贺,不再從Podfile.lock列表中的版本作比對凸舵,它會盡可能的更新到最新版本(前提是新版本和你在Podfile中所設(shè)的約束匹配)。
在測試的時候引入這個框架失尖,而release不引入啊奄,podfile文件中需要怎么寫呢?
pod 'afnxxx', :configurations => ['Debug']

git命令

git命令
rebase作用,合并解決沖突
rebase和merge區(qū)別

bug分析

crash 文件分析(不通過app.dsym符號化)

內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)的解析

iOS isa 指針優(yōu)化

傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掀潮,一起剝皮案震驚了整個濱河市增热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胧辽,老刑警劉巖峻仇,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異邑商,居然都是意外死亡摄咆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門人断,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吭从,“玉大人,你說我怎么就攤上這事恶迈∩穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵暇仲,是天一觀的道長步做。 經(jīng)常有香客問我,道長奈附,這世上最難降的妖魔是什么全度? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮斥滤,結(jié)果婚禮上将鸵,老公的妹妹穿的比我還像新娘勉盅。我一直安慰自己,他們只是感情好顶掉,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布草娜。 她就那樣靜靜地躺著,像睡著了一般痒筒。 火紅的嫁衣襯著肌膚如雪驱还。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天凸克,我揣著相機與錄音议蟆,去河邊找鬼。 笑死萎战,一個胖子當著我的面吹牛咐容,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚂维,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼戳粒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虫啥?” 一聲冷哼從身側(cè)響起蔚约,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涂籽,沒想到半個月后苹祟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡评雌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年树枫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景东。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡砂轻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斤吐,到底是詐尸還是另有隱情搔涝,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布和措,位于F島的核電站庄呈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臼婆。R本人自食惡果不足惜抒痒,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颁褂。 院中可真熱鬧故响,春花似錦、人聲如沸颁独。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誓酒。三九已至樟蠕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靠柑,已是汗流浹背寨辩。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歼冰,地道東北人靡狞。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像隔嫡,于是被迫代替她去往敵國和親甸怕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1.探究KVO的底層實現(xiàn)原理 http://www.reibang.com/p/829864680648 ·KV...
    大馮宇宙閱讀 2,765評論 0 3
  • 1.weak和assign區(qū)別 修飾變量類型的區(qū)別: weak 只可以修飾對象腮恩。如果修飾基本數(shù)據(jù)類型梢杭,編譯器會報錯...
    coderjon閱讀 1,019評論 0 1
  • 一、圖片縮放功能的實現(xiàn) 1.需要一個scrollview或者繼承于scrollview的視圖(如collectio...
    NiCeForMe閱讀 493評論 0 0
  • 網(wǎng)絡(luò)問題 HTTP get 和 post 的區(qū)別 get通過URL向Server獲取數(shù)據(jù)秸滴,也可以在URL里向Ser...
    quantiza閱讀 585評論 0 3
  • 1.介紹下內(nèi)存的幾大區(qū)域? 2.你是如何組件化解耦的? 3.runtime如何通過selector找到對應(yīng)的IMP...
    小孩仔閱讀 1,662評論 0 21