OC基礎(chǔ)部分
優(yōu)質(zhì)鏈接:面試相關(guān)
面試300題
關(guān)于block
block有三種類型:NSConcreteStackBlock并扇,NSConcreteMalloBlock吠昭,NSCroncreteGlobalBlock卢厂。
1.1 當(dāng)block只捕獲了外部局部變量,成員屬性變量奕谭,沒(méi)有強(qiáng)應(yīng)用的block時(shí)候,block就是在棧上,執(zhí)行完僵井,立即釋放。
1.2 當(dāng)block執(zhí)行了copy操作妖泄,或者有強(qiáng)引用指向他的時(shí)候驹沿,block就是Malloc類型的。由程序員控制其生命周期蹈胡,沒(méi)有強(qiáng)引用的時(shí)候渊季,釋放朋蔫。
1.3 當(dāng)block只引用了靜態(tài)變量和全局變量的實(shí)話(沒(méi)有用到外部變量肯定是_NSConcreteGlobalBlock),block是Global類型的却汉。如果引用了全局變量和靜態(tài)變量的同時(shí)驯妄,又引用了局部變量,那該block仍是stackblock的copy和釋放合砂,分別是調(diào)用了:block_copy和block_release
__block的前后
3.1 被__block修飾過(guò)的變量青扔,對(duì)應(yīng)的會(huì)多出一個(gè)結(jié)構(gòu)體 __block_byref_a_0。其中的__forwarding指針翩伪,就是指向自身類型的指針微猖。
3.2 這個(gè)被block修飾過(guò)的變量a,就對(duì)應(yīng)的轉(zhuǎn)換成這個(gè)結(jié)構(gòu)體類型的變量a缘屹。
3.3 然后凛剥,這個(gè)結(jié)構(gòu)體類型的a的地址會(huì)被傳入__main_block_imp_0內(nèi)部,在構(gòu)造方法中給a(__block_byref_a_0類型)賦值轻姿。
3.4 那么犁珠,在__main_block_func_0方法中,通過(guò)__cself->a互亮,取到__block_byref_a_0結(jié)構(gòu)體變量犁享,然后再通過(guò)a->forwarding->a,對(duì)相應(yīng)的變量進(jìn)行值的操作豹休。關(guān)于ARC和MRC
4.1 ARC的情況下炊昆,一旦block被賦值,那就會(huì)執(zhí)行copy操作慕爬,__block類型的變量就會(huì)被拷貝到堆上窑眯,block也是NSMallocBlock。
4.2 MRC的情況下医窿,只有執(zhí)行copy方法磅甩,才會(huì)對(duì)應(yīng)的copy,否則__block一直都在棧上姥卢,block也是NSStackBlock卷要,forwarding指向的就是自身。
4.3 ARC下的對(duì)象類型的變量独榴,加了__block之后僧叉,在block內(nèi)部會(huì)對(duì)變量進(jìn)行retain,會(huì)造成循環(huán)引用棺榔。
4.4 MRC情況下瓶堕,block不會(huì)對(duì)__block對(duì)象本身進(jìn)行復(fù)制,而是復(fù)制了他的指針而已症歇。
4.5 在ARC的情況下郎笆,block通過(guò)“=”賦值時(shí)谭梗,會(huì)調(diào)用:objc_retainBlock->block_copy->block_copy->internal方法鏈,從而將StackBlock轉(zhuǎn)變?yōu)镸allocBlock宛蚓。但是如果在block內(nèi)部使用延時(shí)操作還使用弱指針的話會(huì)取不到該弱指針,需要在block內(nèi)部再將弱指針強(qiáng)引用一下
self和super的區(qū)別
原來(lái)self是返回instancetype類型的代理方法激捏,但又有些奇怪,我們?cè)谧远x子類的時(shí)候并沒(méi)有實(shí)現(xiàn)這個(gè)方法凄吏,我認(rèn)為self的功能远舅,OC已經(jīng)幫我們實(shí)現(xiàn),只是我們看不到而已痕钢。這樣就明確了图柏,self最終返回的結(jié)果就是instancetype類型的東西,它是動(dòng)態(tài)類型盖喷,最終運(yùn)行時(shí)才會(huì)確定爆办,實(shí)例方法返回實(shí)例類型难咕、靜態(tài)方法返回的是Class课梳。
當(dāng)遇到super關(guān)鍵字時(shí),編譯器會(huì)生成一個(gè)objc_super結(jié)構(gòu)體余佃,作為消息的接收者暮刃,objc_super結(jié)構(gòu)體使得接收消息的父類的定義被明確化。
所以爆土,super的含義應(yīng)該是一種編譯指令椭懊,它的作用用來(lái)給父類發(fā)送消息,并返回消息響應(yīng)的結(jié)果步势。
問(wèn)題一:self = [super init]是面向?qū)ο笏枷氲囊环N體現(xiàn)氧猬,意義就是,利用父類的init方法為子類初始化父類的公有屬性坏瘩。問(wèn)題二:理解這個(gè)先要明確alloc和init的區(qū)別盅抚,alloc為對(duì)象開(kāi)辟內(nèi)存,init是對(duì)象初始化倔矾,所以妄均,[super init] 是初始化在子類上的,super發(fā)出消息的主體對(duì)象是子類哪自,和self是同一個(gè)對(duì)象丰包。 class方法和self類似是NSObject協(xié)議中的代理方法,我認(rèn)為class的功能壤巷,OC也已經(jīng)幫我們實(shí)現(xiàn)在每個(gè)子類中邑彪,只是我們看不到而已,所以不管是super還是self發(fā)出的class消息胧华,執(zhí)行的時(shí)候寄症,都在子類中升筏,返回的都是子類。
調(diào)用當(dāng)前類的方法發(fā)消息時(shí)瘸爽,調(diào)用的是:objc_msgSend(id, selector, params)
調(diào)用父類的方法發(fā)消息時(shí)您访,調(diào)用的是:objc_msgSendSuper(struct objc_super *super, selector, params)
其中,objc_super是一個(gè)結(jié)構(gòu)體剪决,里面有接收者和他的父類灵汪,這里的接收者在內(nèi)存中就是當(dāng)前實(shí)例,只不過(guò)柑潦,他尋找方法是先從父類的方法列表中去尋找而已享言。
常見(jiàn)的面試題
關(guān)于runtime
- runtime如何添加屬性和方法。
- runtime如何實(shí)現(xiàn)weak屬性
- runtime如何通過(guò)selector找到對(duì)應(yīng)的IMP方法實(shí)現(xiàn)的渗鬼?
- runtime使用Associate方法關(guān)聯(lián)的對(duì)象览露,需要在dealloc中釋放嗎
- _objc_msgForward是做什么的,直接調(diào)用會(huì)發(fā)生什么譬胎?
- 能否想編譯后得到的類中增加實(shí)力變量差牛?運(yùn)行中呢?為什么堰乔?
- 描述方法調(diào)用的流程(基于runtime的角度)
- 什么是method swizzling偏化?
答:
1.1 class_addMethod(Class cls, SEL name, IMP imp, const char *types)
1.2 class_addIvar(Class cls, const char *name, size_t size,
uint8_t alignment, const char *type)
1.3 _class_addProperty(Class cls, const char *name,
const objc_property_attribute_t *attrs, unsigned int count,
bool replace)
1.4 class_addProtocol(Class cls, Protocol *protocol_gen)
1.5 class_replaceProperty(Class cls, const char *name,
const objc_property_attribute_t *attrs, unsigned int n)
weak變量都在一個(gè)哈希表中,對(duì)象的地址是key镐侯,value是一個(gè)weak引用的地址的數(shù)組侦讨。當(dāng)一次runloop結(jié)束,自動(dòng)釋放池里引用計(jì)數(shù)為0的對(duì)象會(huì)被銷毀苟翻,那么就會(huì)用他的地址去weak表中找到對(duì)應(yīng)的value數(shù)組韵卤,把數(shù)組中的變量置為nil。所以崇猫,在ARC的情況下沈条,不需要把weak屬性在dealloc中置nil。
想對(duì)象發(fā)送消息時(shí)邓尤,調(diào)用objc_msgSend方法拍鲤,第一個(gè)參數(shù)就是當(dāng)前對(duì)象,通過(guò)對(duì)象的ISA指針汞扎,找到對(duì)應(yīng)的類季稳,然后在類的方法緩存列表中查找對(duì)應(yīng)的SEL,如果沒(méi)有澈魄,就到method_list中去查找景鼠,如果還沒(méi)有,就到父類的方法列表中查找。目標(biāo)方法的SEL是一個(gè)結(jié)構(gòu)體铛漓,里面的有方法名字SEL和方法的具體實(shí)現(xiàn):IMP溯香,二者是對(duì)應(yīng)的,所以直接取到IMP執(zhí)行浓恶。另外玫坛,如果調(diào)用類方法,則到元類的方法列表中去找包晰,如果找不到湿镀,直接到跟類的元類中去找,跟類要是找不到伐憾,直接到異常勉痴。另外,調(diào)用父類的方法树肃,是調(diào)用的objc_msgSendSuper方法蒸矛,第一個(gè)參數(shù)是一個(gè)objc_super結(jié)構(gòu)體,里面有receiver(接收者胸嘴,當(dāng)前對(duì)象)雏掠,super_class,這時(shí)候檢索SEL就先去superclass里面去找筛谚。
無(wú)論是ARC還是MRC磁玉,都不需要對(duì)關(guān)聯(lián)的對(duì)象進(jìn)行釋放。這些關(guān)聯(lián)的對(duì)象會(huì)比被關(guān)聯(lián)的對(duì)象釋放的晚驾讲,他們會(huì)被NSObjcet的dealloc調(diào)用的object_dispose方法中釋放倔约。
步驟如下:當(dāng)前對(duì)象release位衩,父類dealloc精续,NSObject調(diào)dealloc摆尝,調(diào)用object_dispose_objc_msgForward是IMP類型嘿歌,用于消息轉(zhuǎn)發(fā)的:當(dāng)向一個(gè)對(duì)象發(fā)送一條消息卷谈,但是對(duì)象又沒(méi)有實(shí)現(xiàn)它笤妙,就會(huì)觸發(fā)轉(zhuǎn)發(fā)蚕涤。
不能向編譯后得到的類中增加實(shí)例變量癞揉,因?yàn)?/p>
使用runtime Associate方法關(guān)聯(lián)的對(duì)象纸肉,需要在主對(duì)象dealloc的時(shí)候釋放么,對(duì)象的釋放時(shí)間表喊熟。
不需要柏肪,
關(guān)于runloop
runloop是啥:運(yùn)行循環(huán)。主線程的runloop默認(rèn)開(kāi)啟芥牌,無(wú)論如何都做不到手動(dòng)關(guān)閉他烦味。
runloop作用是啥:為線程監(jiān)聽(tīng)事件源,控制線程的調(diào)起和休眠壁拉。還可以和自動(dòng)釋放池配合管理內(nèi)存:比如谬俄,局部變量是加入到當(dāng)前最近的自動(dòng)釋放池里面去的柏靶,那自動(dòng)釋放池什么時(shí)候開(kāi)始清理這些變量呢?處理自動(dòng)釋放池銷毀溃论,那就是當(dāng)前運(yùn)行循環(huán)結(jié)束屎蜓,這個(gè)時(shí)候,自動(dòng)釋放池節(jié)點(diǎn)里的數(shù)據(jù)會(huì)被遍歷發(fā)送release消息钥勋。
runloop的使用場(chǎng)景:控制定時(shí)器梆靖,開(kāi)啟一個(gè)常駐線程[[NSRunloop currentRunloop] addPort:[NSPort port] forModel:NSDefalutRunloopModel];這樣可以讓某些事件、行為在某些模式下運(yùn)行笔诵。
CFRunLoopObserverRef是觀察者返吻,每個(gè)observer都有一個(gè)回調(diào),當(dāng)runloop的狀態(tài)發(fā)生變化時(shí)乎婿,觀察者就能在回調(diào)中獲取到這個(gè)變化测僵。變化的觀測(cè)時(shí)機(jī)有:
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即將進(jìn)入Loop
kCFRunLoopBeforeTimers = (1UL << 1), // 即將處理 Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即將處理 Source
kCFRunLoopBeforeWaiting = (1UL << 5), // 即將進(jìn)入休眠
kCFRunLoopAfterWaiting = (1UL << 6), // 剛從休眠中喚醒
kCFRunLoopExit = (1UL << 7), // 即將退出Loop
};
關(guān)于http
1.http常用的方法類型和含義
? GET 請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體谢翎。
? HEAD 請(qǐng)求報(bào)文頭部捍靠,不返回消息體。
? POST 向指定資源提交數(shù)據(jù)森逮,數(shù)據(jù)包含在請(qǐng)求體中榨婆,他可以在服務(wù)器端生成不存在的資源,也可以替換原有的老資源褒侧。
? PUT 用傳遞的新數(shù)據(jù)取代服務(wù)端指定數(shù)據(jù)
? DELETE 請(qǐng)求刪除指定的服務(wù)器的頁(yè)面
? TRACK 返回服務(wù)器收到的請(qǐng)求良风,主要用于測(cè)試或診斷,跟蹤請(qǐng)求是否到達(dá)
? OPTIONS 允許客戶端查看服務(wù)器的性能
? CONNECT 預(yù)留的能將鏈接改為通道的代理服務(wù)器
關(guān)于加密
對(duì)稱加密和非對(duì)稱加密
對(duì)稱加密:加密和解密用同一個(gè)密鑰(因?yàn)樾枰跀?shù)據(jù)傳輸之前傳遞密鑰和密文闷供,所以一旦被截獲烟央,還是很危險(xiǎn)的。)DES,AES,
非對(duì)稱加密:加密和解密用不同的密鑰歪脏,加密用公鑰疑俭,解密用私鑰。RSA,
加密原理
原理二
所以婿失,建立連接的過(guò)程用非對(duì)稱加密钞艇,保證密鑰能安全傳遞,然后在數(shù)據(jù)傳遞的過(guò)程中用對(duì)稱加密豪硅,以提高效率.
MD5:不可逆的加密方式哩照,不能解密,任意長(zhǎng)度的數(shù)據(jù)加密之后都是16進(jìn)制的32位數(shù)據(jù)舟误。
base64:
base64的編碼都是按字符串長(zhǎng)度葡秒,以每3個(gè)8bit的字符為一組,
然后針對(duì)每組,首先獲取每個(gè)字符的ASCII編碼眯牧,
然后將ASCII編碼轉(zhuǎn)換成8bit的二進(jìn)制蹋岩,得到一組3*8=24bit的字節(jié)
然后再將這24bit劃分為4個(gè)6bit的字節(jié),并在每個(gè)6bit的字節(jié)前面都填兩個(gè)高位0学少,得到4個(gè)8bit的字節(jié)
然后將這4個(gè)8bit的字節(jié)轉(zhuǎn)換成10進(jìn)制剪个,對(duì)照Base64編碼表 (下表),得到對(duì)應(yīng)編碼后的字符
面試過(guò)程中問(wèn)到的
1.如果監(jiān)聽(tīng)了一個(gè)readonly的屬性版确,kvo會(huì)怎么處理扣囊?如果我們給這個(gè)屬性添加了setter方法呢?為什么要?jiǎng)?chuàng)建一個(gè)新類绒疗?
參考鏈接
答:如果想要監(jiān)聽(tīng)一個(gè)readonly屬性侵歇,那么,在外部不能直接調(diào)用其setter方法(強(qiáng)行添加setter方法會(huì)連編譯都通不過(guò))吓蘑,可以通過(guò)一個(gè)傳值的方法惕虑,結(jié)合KVC,來(lái)給這個(gè)只讀屬性賦值磨镶。
- (void)careDog:(id)dog {
[self setValue:dog forKey:@"aDog"];
}
1. 開(kāi)始監(jiān)聽(tīng)溃蔫。當(dāng)一個(gè)對(duì)象的屬性被使用 KVO 監(jiān)聽(tīng)的時(shí)候,系統(tǒng)會(huì)自動(dòng)生成一個(gè)以 NSKVONotifying_ 打頭的臨時(shí)的類琳猫,然后將這個(gè)對(duì)象的 isa 指針指向這個(gè)臨時(shí)的類伟叛;
2.當(dāng)監(jiān)聽(tīng)的屬性是 readwrite 的時(shí)候,并不會(huì)往這個(gè)屬性的 setter 方法里插入 -willChangeValueForKey: 和 -didChangeValueForKey: 等方法脐嫂,而是系統(tǒng)會(huì)在設(shè)置屬性的值的時(shí)候調(diào)用 _NSSetObjectValueAndNotify 方法统刮,這個(gè)方法會(huì)發(fā)送一條通知,然后 NSKeyValueNotifyObserver 這個(gè)監(jiān)聽(tīng)者監(jiān)聽(tīng)到值的改變的時(shí)候雹锣,會(huì)發(fā)送一個(gè)通知調(diào)起 -observeValueForKeyPath
3.如果沒(méi)有重寫 -willChangeValueForKey: 和 -didChangeValueForKey: 方法网沾,這兩個(gè)方法就不會(huì)被調(diào)起。
為什么要?jiǎng)?chuàng)建一個(gè)子類來(lái)實(shí)現(xiàn)蕊爵?
可以這樣說(shuō),如果我們不通過(guò)創(chuàng)建子類桦山,那可以通過(guò)什么方法來(lái)實(shí)現(xiàn)呢攒射?
提前知道的:通過(guò)子類繼承父類屬性并重寫了它的setter方法,當(dāng)這個(gè)屬性被改變時(shí)恒水,KVO 就可以觀察到会放。通過(guò)method_swizzling方法來(lái)進(jìn)行觀察值?注意:如果內(nèi)存當(dāng)中有多個(gè)該類的實(shí)力钉凌,那這些事例都會(huì)受到影響咧最。如最常用觀察的UITableView的contentOffset, 此處如果直接在 Setter 方法中用 method_swizzling 的方法,那么所有的UITableView都會(huì)受到影響,而我們一個(gè) App 中不止一個(gè)UITableView矢沿。
2.用runloop做過(guò)什么功能滥搭?如何保證runloop不退出,除了timer之外還能添加什么方式捣鲸?afn有一個(gè)關(guān)于runloop的經(jīng)典處理瑟匆,需要了解下。
詳細(xì)鏈接
2.1 NSTimer的model切換
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
2.2 ImageView的延遲加載
[self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"tupian"] afterDelay:4.0 inModes:NSDefaultRunLoopMode];
3.用多線程做過(guò)什么栽惶?各種常見(jiàn)鎖的優(yōu)缺點(diǎn)愁溜?
各種多線程實(shí)現(xiàn)的方式
鎖:@synchronized 互斥鎖
優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問(wèn)題。
缺點(diǎn):需要消耗大量的CPU資源外厂。
自旋鎖:原子操作的時(shí)候就是自旋鎖冕象,效率很高。
具體的使用場(chǎng)景:圖片上傳汁蝶,不阻塞主線程渐扮。復(fù)雜耗時(shí)的數(shù)據(jù)處理,
UIGraphicsGetImageFromCurrentImageContext + drawInRect = 圖片合成穿仪。
4.組件化的本質(zhì)席爽,組件之間如何通訊。
原則:上層依賴下層啊片,下層服務(wù)不能依賴上層只锻。同層級(jí)的服務(wù)盡量不要耦合。封閉固定不變的參數(shù)紫谷,暴露變化的參數(shù)齐饮。
1.基礎(chǔ)底層服務(wù)組件:網(wǎng)絡(luò),緩存笤昨,日志等祖驱。
2.基礎(chǔ)業(yè)務(wù)組件:登錄、分享瞒窒、推送捺僻、基礎(chǔ)UI等。
3.基礎(chǔ)工具組件:顏色宏崇裁、設(shè)備信息宏匕坯、字符串處理相關(guān)。
5.jsonmodel自己如何實(shí)現(xiàn)拔稳,如何做對(duì)象的映射葛峻。
6.通知中心一定要在Delloc中移除監(jiān)聽(tīng)嗎,如果不移除會(huì)有什么后果巴比?通知中心對(duì)當(dāng)前類(觀察者)是強(qiáng)引用嗎术奖,也就是說(shuō)通知中心是怎么管理那些監(jiān)聽(tīng)者的礁遵?
實(shí)現(xiàn)原理
多線程角度
iOS9以后通知中心的變化
7.MVVM的真正價(jià)值在哪里,他和MVC相比采记,解決了什么問(wèn)題佣耐。
8.截屏部分,如果再子線程中操作UIKit的UIImage挺庞,會(huì)報(bào)警告嗎晰赞?
消息發(fā)送
1.向?qū)ο蟀l(fā)送消息的流程
2.向類發(fā)送消息的流程
3.向nil發(fā)送消息的流程
1. 如果一個(gè)方法返回值是一個(gè)對(duì)象,那么發(fā)送給nil的消息將返回0(nil)选侨。
例如:Person * motherInlaw = [[aPerson spouse] mother];
如果 spouse 對(duì)象為 nil掖鱼,那么發(fā)送給 nil 的消息 mother 也將返回 nil。
2. 如果方法返回值為指針類型援制,其指針大小為小于或者等于sizeof(void*)戏挡,float,double, long double 或者 long long 的整型標(biāo)量晨仑,發(fā)送給 nil 的消息將返回0褐墅。
3. 如果方法返回值為結(jié)構(gòu)體,發(fā)送給 nil 的消息將返回0。結(jié)構(gòu)體中各個(gè)字段的值將都是0洪己。
4. 如果方法的返回值不是上述提到的幾種情況妥凳,那么發(fā)送給 nil 的消息的返回值將是未定義的
4.消息轉(zhuǎn)發(fā)流程
4.1 首先在當(dāng)前類里判斷有沒(méi)有實(shí)現(xiàn) - (BOOL)resolveInstanceMethod方法,如果有答捕,且返回YES逝钥,則執(zhí)行該方法,我們可以在這個(gè)方法中為對(duì)象動(dòng)態(tài)添加目標(biāo)方法拱镐,class_addMethod(instance, SEL, IMP, "params")艘款。然后,消息轉(zhuǎn)發(fā)流程會(huì)重新調(diào)用一次沃琅。
4.2 如果第一步失敗哗咆,那么進(jìn)入第二步,指定另一個(gè)響應(yīng)該方法的target益眉, - (id)forwardingTargetForSelector,返回另一個(gè)新對(duì)象來(lái)相應(yīng)當(dāng)前方法晌柬。如果返回nil對(duì)象,或者self郭脂,則進(jìn)行下一步空繁,否則就會(huì)重新對(duì)新對(duì)象發(fā)送消息。
4.3 這也是最后一步朱庆,是創(chuàng)建一個(gè)新對(duì)象來(lái)接受消息 - (NSMethodSignature *)methodSignatureForSelector 獲取到消息的參數(shù)和名字,如果返回nil闷祥,則最終處理找不到方法娱颊,程序crash傲诵。else,- (void)forwardingInvocation
@synthesize
1箱硕、在頭文件中用@property聲明一個(gè)屬性名拴竹,編譯器會(huì)自動(dòng)為我們轉(zhuǎn)換成這個(gè)屬性名的getter方法和setter方法。
2剧罩、在實(shí)現(xiàn)文件中使用@synthesize propertyName栓拜,編譯器先會(huì)查找這個(gè)屬性名的setter方法和getter方法有沒(méi)有被人為實(shí)現(xiàn),如果已經(jīng)實(shí)現(xiàn)惠昔,則不再實(shí)現(xiàn)幕与,如果沒(méi)有,則會(huì)幫我們生成一個(gè)屬性命的setter方法和getter方法镇防。
3啦鸣、當(dāng)在實(shí)現(xiàn)文件中使用了@synthesize propertyName,編譯器還會(huì)做一件事情来氧,在類成員變量中查找一個(gè)名為_(kāi)propertyName的成員變量诫给,如果沒(méi)有,再繼續(xù)查找名為propertyName的成員變量啦扬,如果這兩個(gè)都沒(méi)有中狂,編譯器會(huì)自動(dòng)為我們生成一個(gè)私有的名為_(kāi)propertyName的成員變量。注意扑毡,系統(tǒng)自動(dòng)創(chuàng)建的都是私有的胃榕。
4、當(dāng)在實(shí)現(xiàn)文件中這樣寫@synthesize propertyName = varName;時(shí)僚楞,setter和getter方法所對(duì)應(yīng)的是一個(gè)名為varName的成員變量勤晚,修改和讀取的是varName成員變量的值。
5泉褐、當(dāng)我們?cè)趯?shí)現(xiàn)文件中不寫@synthesize propertyName時(shí)赐写,在Xcode 4.5之前的版本不會(huì)幫我們自動(dòng)實(shí)現(xiàn)setter和getter方法,系統(tǒng)當(dāng)然也不再會(huì)為我們生成對(duì)應(yīng)的成員變量膜赃。但是在Xcode 4.5之后可以不用寫@synthesize了挺邀,就跟3、4一樣了跳座。
6端铛、當(dāng)我們既定義了@synthesize,又在實(shí)現(xiàn)文件中人為重寫setter和getter方法時(shí)疲眷,那么@synthesize將不再工作禾蚕,也就不會(huì)為我們創(chuàng)建沒(méi)有定義的_propertyName成員變量了,這時(shí)候如果在setter和getter方法中調(diào)用_propertyName將會(huì)發(fā)生編譯錯(cuò)誤狂丝!@property 后面可以有哪些修飾符?
深拷貝换淆、淺拷貝
NSString:
在非集合類對(duì)象中:對(duì) immutable 對(duì)象進(jìn)行 copy 操作哗总,是指針復(fù)制,mutableCopy 操作時(shí)內(nèi)容復(fù)制倍试;對(duì) mutable 對(duì)象進(jìn)行 copy 和 mutableCopy 都是內(nèi)容復(fù)制讯屈。用代碼簡(jiǎn)單表示如下:
? [immutableObject copy] // 淺復(fù)制
? [immutableObject mutableCopy] //深復(fù)制
? [mutableObject copy] //深復(fù)制
? [mutableObject mutableCopy] //深復(fù)制
NSArray,NSDictionary
在集合類對(duì)象中县习,對(duì) immutable 對(duì)象進(jìn)行 copy涮母,是指針復(fù)制, mutableCopy 是內(nèi)容復(fù)制躁愿;對(duì) mutable 對(duì)象進(jìn)行 copy 和 mutableCopy 都是內(nèi)容復(fù)制叛本。但是:集合對(duì)象的內(nèi)容復(fù)制僅限于對(duì)象本身,對(duì)象元素仍然是指針復(fù)制攘已。用代碼簡(jiǎn)單表示如下:
[immutableObject copy] // 淺復(fù)制
[immutableObject mutableCopy] //單層深復(fù)制
[mutableObject copy] //單層深復(fù)制
[mutableObject mutableCopy] //單層深復(fù)制
UIKit部分
table的優(yōu)化
- 緩存高度
- table中耗時(shí)操作炮赦、計(jì)算、圖片處理的功能放到子線程移步處理
- 條件繪制:1样勃、滑動(dòng)時(shí)不加載圖片吠勘,2、高速滑動(dòng)時(shí)峡眶,只處理停下來(lái)的那幾個(gè)cell
- 少用透明圖層(避免離屏渲染)
- 盡量減少subviews的數(shù)量(減少cell的層級(jí)剧防,因?yàn)殇秩緦蛹?jí)樹(shù)是一個(gè)耗時(shí)的操作)
- 在heightForRowAtIndexPath:中盡量不使用 cellForRowAtIndexPath:,如果你需要用到它辫樱,只用一次然后緩存結(jié)果
- 避免動(dòng)態(tài)給cell添加view峭拘。如果有必要,可以開(kāi)始就添加狮暑,不想顯示就隱藏鸡挠,需要顯示才顯示。
朋友總結(jié)
-
BI埋點(diǎn)方案
- 埋點(diǎn)方式:無(wú)侵入搬男、聲明埋點(diǎn)拣展、代碼埋點(diǎn) 參考
-
hybrid&webview方案
react native
網(wǎng)絡(luò)框架
緩存
資深開(kāi)發(fā)基礎(chǔ)深入:
- DSYM是什么缔逛,原理
- 設(shè)計(jì)模式的分類备埃,怎么寫抽象工廠和工廠方法
- layoutsubview和drawrect被調(diào)用時(shí)機(jī)
- iOS消息與響應(yīng)者原理,如何利用消息轉(zhuǎn)發(fā)防止沒(méi)有實(shí)現(xiàn)的方法閃退
- 什么是內(nèi)存泄漏和野指針褐奴,發(fā)生的場(chǎng)景有那些
- NSOperation能不能取消按脚,一定會(huì)取消?
- iOS事件有哪些種類
- 從GCD角度說(shuō)同步異步敦冬,并行串行, GCD原理辅搬?
- runloop和timer的關(guān)系
- 遇到哪些閃退場(chǎng)景,怎么防范
- method和selector的區(qū)別
- autoreleasepool 參考
- 宏define與常量const 參考
- 深淺拷貝 參考
- Http的請(qǐng)求脖旱,包含哪些伞辛?頭部包含哪些烂翰?請(qǐng)求本身包含哪些, 如何進(jìn)行傳輸瘦身蚤氏?gzip?原理踊兜?有沒(méi)有其他更好的方案?
- iOS底層
- block 1深入原理 2利用clang解析
- 動(dòng)畫(huà)
- 如何保持渲染速度竿滨,更高的fps
- KVO&KVC
- runtime 簡(jiǎn)歷入門
-
網(wǎng)絡(luò)層應(yīng)用及原理
- Http原理,TCP/IP
- 網(wǎng)絡(luò)庫(kù)應(yīng)用
- API的token如何設(shè)計(jì)參考
-
React Native
內(nèi)存管理
1.assign捏境、weak于游、strong、copy的區(qū)別垫言。assign贰剥、weak造成野指針和內(nèi)存泄露的原因。
1.1. runtime如何管理weak變量的筷频。
1.2 如果一個(gè)c類型的結(jié)構(gòu)體蚌成,需要用什么關(guān)鍵字修飾。
property可以聲明結(jié)構(gòu)體類型的屬性凛捏,但是必須要之名struct担忧,并且必須用assign。因?yàn)榻Y(jié)構(gòu)體不是對(duì)象坯癣。
2.所有權(quán)修飾符的用法:__strong,__weak,__autoreleaseing,__bridge
3.自動(dòng)釋放池的機(jī)制瓶盛,自動(dòng)釋放池到底是什么
4.深拷貝/淺copy
mutable --> copy 深拷貝
mutable --> mutablecopy 深拷貝
imutable --> copy 淺拷貝
imutable --> mutablecopy 深拷貝
如果這些事集合類型,則對(duì)應(yīng)的深拷貝為單層深拷貝示罗。即:只拷貝對(duì)象本身惩猫,對(duì)象里面的對(duì)象指針不拷貝。
UIKit
UIButton蚜点、UIView轧房、UIViewController的層級(jí)結(jié)構(gòu):
UIButton ->UIControl -> UIView-> UIResponder -> NSObject
UIViewController -> UIResponder -> NSObjectUIView和UIWindow的關(guān)系。
UIWindow是UIView的子類禽额。-
UIView和CALayer的關(guān)系锯厢。
UIView繼承于UIResponder, UIResponder繼承于NSObject,UIView可以響應(yīng)用戶事件。CALayer繼承于NSObject脯倒,所以CALayer不能響應(yīng)事件实辑。UIView構(gòu)建界面, UIView側(cè)重于對(duì)內(nèi)容的管理,CALayer側(cè)重于對(duì)內(nèi)容的繪制藻丢。UIView是用來(lái)顯示內(nèi)容的剪撬,可以處理用戶事件;CALayer是用來(lái)繪制內(nèi)容的悠反,對(duì)內(nèi)容進(jìn)行動(dòng)畫(huà)處理残黑,依賴與UIView來(lái)進(jìn)行顯示馍佑,不能處理用戶事件。
UIView:屬于UIkit.framework框架,負(fù)責(zé)渲染矩形區(qū)域的內(nèi)容,為矩形區(qū)域添加動(dòng)畫(huà),響應(yīng)區(qū)域的觸摸事件,布局和管理一個(gè)或多個(gè)子視圖UIWindow:屬于UIKit.framework框架,是一種特殊的UIView,通常在一個(gè)程序中只會(huì)有一個(gè)UIWindow,但可以手動(dòng)創(chuàng)建多個(gè)UIWindow,同時(shí)加到程序里面梨水。UIWindow在程序中主要起到三個(gè)作用:1拭荤、作為容器,包含app所要顯示的所有視圖2、傳遞觸摸消息到程序中view和其他對(duì)象3疫诽、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持CAlayer:屬于QuartzCore.framework,是用來(lái)繪制內(nèi)容的,對(duì)內(nèi)容進(jìn)行動(dòng)畫(huà)處理依賴與UIView來(lái)進(jìn)行顯示,不能處理用戶事件舅世。UIView和CALayer是相互依賴的,UIView依賴CALayer提供內(nèi)容,CALayer依賴UIView一共容器顯示繪制內(nèi)容。
block
1.block是什么奇徒?block類型的屬性為什么要用copy修飾雏亚?一定得用copy嗎?block的底層是怎么實(shí)現(xiàn)的摩钙?block有幾種類型罢低?
2.使用block要注意什么?循環(huán)引用問(wèn)題胖笛。修改外部變量問(wèn)題网持。
補(bǔ)充……
js/native交互
1.wk和UIWebView之間區(qū)別,探底匀钧。
2.jscore的原理
3.其他三方框架
補(bǔ)充……
runtime
1.oc動(dòng)態(tài)性表現(xiàn)在那些方面翎碑?
2.oc對(duì)象的本質(zhì)是什么摩瞎,從消息的發(fā)送說(shuō)一下runtime的工作流程榛瓮。
6.常用的給類添加方法和屬性的API
objc_setAssociatedObject
objc_getAssociatedObject
objc_removeAssociatedObjects
category
1.跟runtime有什么關(guān)系莉擒,從runtime的角度對(duì)category 的原理進(jìn)行分析。
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
if !OBJC2
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
endif
} OBJC2_UNAVAILABLE;
struct objc_category {
char *category_name OBJC2_UNAVAILABLE;
char *class_name OBJC2_UNAVAILABLE;
struct objc_method_list *instance_methods OBJC2_UNAVAILABLE;
struct objc_method_list *class_methods OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
} OBJC2_UNAVAILABLE;
2.為什么不能給category添加屬性瘫絮,但是寫了屬性也不報(bào)錯(cuò)涨冀。
3.和extension的區(qū)別
多線程
1.GCD/NSOrperationQueue的區(qū)別。
2.說(shuō)說(shuō)線程依賴麦萤。NSOrperation能不能取消鹿鳖,一定可以取消嗎?
4.加鎖的方法壮莹,死鎖的場(chǎng)景翅帜。
6.線程間通訊。
7.runloop的本質(zhì)歼疮,各個(gè)model的區(qū)別杂抽。runloop和線程的關(guān)系。
從多線程的角度分析共享數(shù)據(jù)和私有數(shù)據(jù)韩脏。
GCD和NSOperationQueue功能能完全對(duì)等嗎缩麸?
GCD和線程隊(duì)列的區(qū)別,第二篇
不能骤素,隊(duì)列可以取消匙睹,可以設(shè)置最大并發(fā)數(shù)MaxConcurrentOperationCount,但他也可以通過(guò)dispatch_semaphore_t信號(hào)量來(lái)控制济竹。
補(bǔ)充……
關(guān)于鎖
UIkit & Fundation
1.事件類型有哪些。具體了解響應(yīng)者和響應(yīng)鏈霎槐。
2.table的性能優(yōu)化
3.常用控件的繼承體系送浊,比如UIButton和UITableView
4.APP的加載過(guò)程,他的各個(gè)狀態(tài)丘跌。
補(bǔ)充……
KVO & KVC
1.各自的實(shí)現(xiàn)原理。
絕金iOS
2.有什么優(yōu)缺點(diǎn)闭树,其他三方庫(kù)的替代方案
補(bǔ)充……
網(wǎng)絡(luò)
1.http/HTTPS的區(qū)別耸棒,TCP和UDP的區(qū)別,get和post本質(zhì)的區(qū)別
2.一個(gè)請(qǐng)求的報(bào)文是什么报辱。響應(yīng)報(bào)文是什么与殃。
3.TCP方式cs之間的鏈接過(guò)程。
4.HTTPS加密請(qǐng)求數(shù)據(jù)的過(guò)程
5.如何對(duì)AFN進(jìn)行二次封裝碍现。為什么afn用block而不用delegate幅疼?
補(bǔ)充……
數(shù)據(jù)采集
架構(gòu)
1.常用架構(gòu)MVC、MVP昼接、MVVM的區(qū)別爽篷,優(yōu)缺點(diǎn)。
2.組件化慢睡,中間件
4.自動(dòng)化集成Jenkins逐工,fastlane
補(bǔ)充……
優(yōu)化
電量、啟動(dòng)速度漂辐、CPU占用泪喊、網(wǎng)絡(luò)優(yōu)化
補(bǔ)充……
數(shù)據(jù)結(jié)構(gòu)和算法
常用的排序查找方式,時(shí)間者吁、空間復(fù)雜度
其他幾乎都是這幾種推演過(guò)來(lái)的
其他
3.緩存設(shè)計(jì)(存儲(chǔ)安全,過(guò)期刪除問(wèn)題,以sd為例分析)
面試題
hr面試問(wèn)題
1.作為技術(shù)經(jīng)理瘤泪,如何管理你的團(tuán)隊(duì)灶泵,如何激勵(lì)員工,采取過(guò)哪些措施
作為技術(shù)出身对途,我最能體會(huì)團(tuán)隊(duì)成員最根本的關(guān)注點(diǎn)在哪赦邻。舉個(gè)例子,一個(gè)中級(jí)工程師最關(guān)切的往往是如何明確地規(guī)劃自己以后的職業(yè)發(fā)展方向实檀、技術(shù)側(cè)重點(diǎn)等這些問(wèn)題惶洲,這些也恰是我當(dāng)初深為困惑的,我會(huì)經(jīng)常和我的組員進(jìn)行工作之外的溝通膳犹,了解他們的想法恬吕,針對(duì)他們不同時(shí)期的不同問(wèn)題和他一起討論,加上自己的一些經(jīng)驗(yàn)须床,給出最終的一個(gè)建議铐料。一個(gè)團(tuán)隊(duì)最重要的是活力,而這些年輕的組員恰是這些活力的提供者豺旬,我所作的是在恰當(dāng)?shù)臅r(shí)候點(diǎn)燃他們的熱情钠惩,讓他們始終抱有希望。具體的措施就主要體現(xiàn)在每個(gè)季度開(kāi)始前的工作族阅、學(xué)習(xí)計(jì)劃安排篓跛,以及季度末的績(jī)效審評(píng)。
-
和PM或其他部門發(fā)生意見(jiàn)分歧時(shí)坦刀,如何處理愧沟。
主要還是溝通的技巧,明確自己的目標(biāo)求泰、可以接受的底線央渣,溝通開(kāi)始先拋出一個(gè)hight的目標(biāo),以談判的方式把最終達(dá)成的協(xié)議控制在自己的底線之上渴频。這是原則芽丹,可以接受讓步,恰當(dāng)照顧溝通方的感受卜朗,以最終達(dá)成協(xié)議為目的拔第。另外需要注意的就是溝通中的措詞,盡量避免“我”场钉,“必須”蚊俺,“我不管”這些字眼,取而代之可以用“我們”逛万,“最好”泳猬,“我們可不可以”。
-
對(duì)你幫最大的人是誰(shuí)?怎么看待你的前領(lǐng)導(dǎo)得封?(你能從他們身上學(xué)到什么埋心?要客觀,又要謙虛忙上。)
之前的組長(zhǎng)拷呆,他身上有種不怕失敗,勇于嘗試的韌勁兒疫粥,只要是自己既定的目標(biāo)茬斧,從不淺嘗輒止,都要把他們弄的十分透徹梗逮,并且盡最大努力將其運(yùn)用到工作中來(lái)项秉,以提高我們的工作效率和穩(wěn)定性等等。從不半途而廢慷彤,即使這個(gè)問(wèn)題臨時(shí)擱淺伙狐,他也會(huì)擠時(shí)間把他落地。
-
你的優(yōu)缺點(diǎn)是什么瞬欧?
缺點(diǎn):有時(shí)候自己腦海中迸發(fā)一個(gè)想法之后,會(huì)固執(zhí)己見(jiàn)堅(jiān)持他是對(duì)的罢防,想盡辦法會(huì)將其付諸實(shí)施艘虎,這個(gè)過(guò)程中同事如果有一些否定的意見(jiàn),自己會(huì)聽(tīng)不進(jìn)去咒吐,除非他的說(shuō)辭比較完美野建。這樣的后果會(huì)導(dǎo)致不能及時(shí)聽(tīng)取他人意見(jiàn),發(fā)現(xiàn)自己想法的弊端恬叹,這也是我正在努力改正的候生。
優(yōu)點(diǎn):主觀能動(dòng)性強(qiáng),能夠及時(shí)了解自己的缺點(diǎn)并改正绽昼,與人交流過(guò)程中善于換位思考唯鸭,做事注重效率、注重目標(biāo)主導(dǎo)策略硅确、注重及時(shí)暴露風(fēng)險(xiǎn)等目溉。
-
工作中什么事是最困難的是什么?怎么解決菱农?
說(shuō)服我的上級(jí)同意我的方案缭付。當(dāng)然,我自己作為小組leader的時(shí)候循未,也存在不能及時(shí)聽(tīng)取他人意見(jiàn)的時(shí)候陷猫,總是堅(jiān)持自己是對(duì)的,從而導(dǎo)致其他組員一些好的想法被否決。針對(duì)這一問(wèn)題绣檬,我深入的思考過(guò)足陨,這也是我現(xiàn)在正刻意讓自己做的一件事:換位思考。
-
最有意義的一些事是什么河咽?
主導(dǎo)推進(jìn)自動(dòng)化打包平臺(tái)钠右,解放了所以程序員在打包上浪費(fèi)時(shí)間的問(wèn)題。投入產(chǎn)出比非常高忘蟹。
和別人相比飒房,你的優(yōu)勢(shì)在什么地方?
我經(jīng)常反思自己的不足媚值,花在這上面的時(shí)間要比我回顧自己獲得的成就上的時(shí)間要多很多狠毯。這讓我在以往這幾年有很大的進(jìn)步,當(dāng)然褥芒,由于精力有限和公司快速迭代等原因嚼松,我的進(jìn)步空間還有很大,這也恰是我現(xiàn)在思考的一個(gè)問(wèn)題锰扶,如何讓自己從一個(gè)稱職的員工變成一個(gè)優(yōu)秀的員工献酗,推而廣之,如何把我自身的這些想法總結(jié)成解決問(wèn)題的原則坷牛,來(lái)幫助更多的人罕偎。作為一個(gè)技術(shù)經(jīng)理,我認(rèn)為這是我最核心的優(yōu)勢(shì)之一京闰,其他還有很多颜及,如果有幸成為同事,我們?cè)谝院蟮墓ぷ髦锌梢宰龈由钊氲奶接戸彘埂Vx謝俏站。
-
阿里的核心競(jìng)爭(zhēng)力:
執(zhí)行力
管理者的指責(zé):讓員工成長(zhǎng)、成功痊土,這才是管理者的成功肄扎,管理者要以身作則。要考慮員工需要什么樣的成長(zhǎng)施戴,什么樣的機(jī)會(huì)反浓,
高遠(yuǎn)的目標(biāo)和極強(qiáng)的使命感,使命:“讓天下沒(méi)有難做的生意”
客戶第一赞哗、團(tuán)隊(duì)合作雷则、擁抱變化、激情肪笋、誠(chéng)信月劈、敬業(yè)度迂,六脈神劍
1.oc的內(nèi)存管理機(jī)制,能說(shuō)多少說(shuō)多少猜揪。
2.block你了解多少惭墓?講講原理,使用過(guò)程中的注意事項(xiàng)而姐。
3.runloop的實(shí)現(xiàn)原理是什么腊凶?你用runloop做過(guò)哪些事?了解AFN中關(guān)于runloop的經(jīng)典用法嗎拴念?你用多線程做過(guò)什么钧萍?
4.你在工作中是是用gcd多還是nsoporationQueue多?為什么政鼠?
5.你怎么理解組件化风瘦?你們?cè)诮M建化方面都做了哪些?有什么難點(diǎn)嗎公般?怎么解決的万搔?
6.kvo和kvc的實(shí)現(xiàn)原理?kvo有點(diǎn)麻煩官帘,有沒(méi)有更好的設(shè)計(jì)方案來(lái)使用它瞬雹?
7.https的數(shù)據(jù)請(qǐng)求流程是什么?對(duì)稱加密和非對(duì)稱加密都扮演什么樣的角色刽虹?
8.數(shù)據(jù)安全你們是怎么做的挖炬?登錄部分的session是怎么和h5同步的,如何保證他的安全性状婶?
9.怎么獲取用戶操作過(guò)程中出現(xiàn)的屏幕卡頓?卡頓的基本原因是什么馅巷?
10.熱修復(fù)用過(guò)什么方案膛虫,除了jspath,還了解其他的嗎钓猬?jspath的核心原理是什么稍刀?
11.如何預(yù)防類似數(shù)組越界造成的crash?
12.一個(gè)數(shù)組分為兩部分敞曹,前面升序账月,后面降序,如何快速的找到最大值澳迫?
13.寫一個(gè)遞歸局齿,遞歸的缺陷在哪?如何優(yōu)化遞歸橄登?
14.你用MVVM解決了什么痛點(diǎn)抓歼?說(shuō)說(shuō)你對(duì)MVVM的理解讥此。
15.對(duì)你影響最大的一個(gè)人是誰(shuí)?
16.工作中最有成就的是什么事谣妻?
17.和同事意見(jiàn)不一致萄喳,你該怎么解決?如果是領(lǐng)導(dǎo)呢?