1.UITableview的優(yōu)化方法(緩存高度,異步繪制凯旋,減少層級呀潭,hide,避免離屏渲染)
緩存高度:當(dāng)我們創(chuàng)建frame模型的時候至非,計算出來cell的高度的時候钠署,我們可以將cell的高度緩存到字典里面,以cell的
indexpath
和Identifier
作為為key荒椭。
NSString *key = [[HeightCache shareHeightCache] makeKeyWithIdentifier:@"YwywProductGradeCell" indexPath:indexPath];
if ([[HeightCache shareHeightCache] existInCacheByKey:key]) {
return [[HeightCache shareHeightCache] heightFromCacheWithKey:key];
}else{
YwywProductGradeModelFrame *modelFrame = self.gradeArray[indexPath.row];
[[HeightCache shareHeightCache] cacheHieght:modelFrame.cellHight key:key];
return modelFrame.cellHight;
}
異步繪制谐鼎、減少層級:目前還不是很清楚
hide:個人理解應(yīng)該是hidden
吧,把可能會用到的控件都創(chuàng)建出來戳杀,根據(jù)不同的情況去隱藏或者顯示出來该面。
避免離屏渲染:只要不是同時使用邊框/邊框顏色以及圓角的時候
夭苗,都可以使用layer直接設(shè)置。不會造成離屏渲染隔缀。
2.有沒有用過運行時题造,用它都能做什么?(交換方法猾瘸,創(chuàng)建類界赔,給新創(chuàng)建的類增加方法,改變isa指針)
交換方式:一般寫在類的+(void)load方法里面
/** 獲取原始setBackgroundColor方法 */
Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));
/** 獲取自定義的pb_setBackgroundColor方法 */
Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));
/** 交換方法 */
method_exchangeImplementations(originalM, exchangeM);
創(chuàng)建類:
Class MyClass = objc_allocateClassPair([NSObject class], "Person", 0);
添加方法
/**參數(shù)一牵触、類名參數(shù)
二淮悼、SEL 添加的方法名字參數(shù)
三、IMP指針 (IMP就是Implementation的縮寫揽思,它是指向一個方法實現(xiàn)的指針袜腥,每一個方法都有一個對應(yīng)的IMP)
參數(shù)四、其中types參數(shù)為"i@:@“钉汗,按順序分別表示:具體類型可參照[官方文檔](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)i 返回值類型int羹令,若是v則表示void@ 參數(shù)id(self): SEL(_cmd)@ id(str)
V@:表示返回值是void 帶有SEL參數(shù) (An object (whether statically typed or typed id))
*/
class_addMethod(Person, @selector(addMethodForMyClass:), (IMP)addMethodForMyClass, "V@:");
添加實例變量
/**參數(shù)一、類名參數(shù)
二损痰、屬性名稱參數(shù)
三福侈、開辟字節(jié)長度參數(shù)
四、對其方式參數(shù)
五卢未、參數(shù)類型 “@” 官方解釋 An object (whether statically typed or typed id) (對象 靜態(tài)類型或者id類型) 具體類型可參照[官方文檔](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)return: BOOL 是否添加成功
*/
BOOL isSuccess = class_addIvar(Person, "name", sizeof(NSString *), 0, "@");
isSuccess?NSLog(@"添加變量成功"):NSLog(@"添加變量失敗");
3.看過哪些第三方框架的源碼肪凛?都是如何實現(xiàn)的?(如果沒有辽社,問一下多圖下載的設(shè)計)
4.SDWebImage的緩存策略伟墙?
sd加載一張圖片的時候,會先在內(nèi)存里面查找是否有這張圖片爹袁,如果沒有會根據(jù)圖片的md5(url)后的名稱去沙盒里面去尋找远荠,是否有這張圖片矮固,如果沒有會開辟線程去下載失息,下載完畢后加載到imageview上面,并md(url)為名稱緩存到沙盒里面档址。
5.AFN為什么添加一條常駐線程盹兢?
AFN 目的:就是開辟線程請求網(wǎng)絡(luò)數(shù)據(jù)。如果沒有常住線程的話守伸,就會每次請求網(wǎng)絡(luò)就去開辟線程绎秒,完成之后銷毀開辟線程,這樣就造成資源的浪費尼摹,開辟一條常住線程见芹,就可以避免這種浪費剂娄,我們可以在每次的網(wǎng)絡(luò)請求都添加到這條線程。
6.KVO的使用玄呛?實現(xiàn)原理阅懦?(為什么要創(chuàng)建子類來實現(xiàn))
kvo:鍵值觀察,根據(jù)鍵對應(yīng)的值的變化徘铝,來調(diào)用方法耳胎。
注冊觀察者:addObserver:forKeyPath:options:context:
實現(xiàn)觀察者:observeValueForKeyPath:ofObject:change:context:
移除觀察者:removeObserver:forKeyPath:(對象銷毀,必須移除觀察者)
注意
使用kvo監(jiān)聽A對象的時候惕它,監(jiān)聽的本質(zhì)不是這個A對象怕午,而是系統(tǒng)創(chuàng)建的一個中間對象NSKVONotifying_A
并繼承A對象,并且A對象的isa指針指向的也不是A的類淹魄,而是這個NSKVONotifying_A
對象
kvo詳解
kvo詳解2
7.KVC的使用郁惜?實現(xiàn)原理?(KVC拿到key以后甲锡,是如何賦值的扳炬?知不知道集合操作符,能不能訪問私有屬性搔体,能不能直接訪問_ivar)
kvc:鍵值賦值恨樟,使用最多的即使字典轉(zhuǎn)模型。利用runtime獲取對象的所有成員變量疚俱, 在根據(jù)kvc鍵值賦值劝术,進行字典轉(zhuǎn)模型
setValue: forKey: 只查找本類里面的屬性
setValue: forKeyPath:會查找本類里面屬性,沒有會繼續(xù)查找父類里面屬性呆奕。
kvc詳解