問題:
1.如何實(shí)現(xiàn)多代理回調(diào),并且多個(gè)代理的方法都要執(zhí)行?
創(chuàng)建中間橋接類(代理的容器類),橋接類定義單獨(dú)的代理對(duì)象屬性 ?vc提供adddelegate的方法以及存儲(chǔ)橋接類的數(shù)組,回調(diào)的時(shí)候遍歷存儲(chǔ)橋接類的數(shù)組,依次執(zhí)行協(xié)議方法。
2.事件分發(fā)原理,手勢(shì)傳遞過程
只有繼承與uiresponder的對(duì)象能夠響應(yīng)事件touch對(duì)應(yīng)的api,事件產(chǎn)生后被加到uiapplication管理的事件隊(duì)列中,由它來由里往外遞,window-view-subview,遞歸傳遞(找到view之后調(diào)用hittest:查找view的子view),找到最合適的view(響應(yīng)鏈第一響應(yīng)者)后調(diào)用touches方法對(duì)事件進(jìn)行響應(yīng),如果沒有重寫將事件沿著響應(yīng)者鏈往上拋(由外往里拋一直到uiapplication,與事件傳遞相反),手勢(shì)識(shí)別器會(huì)延遲事件向所綁定的視圖傳遞,優(yōu)先去識(shí)別手勢(shì)處理touch事件
3.sd圖片存儲(chǔ)過期時(shí)間在什么時(shí)機(jī)設(shè)置?(有效時(shí)間設(shè)置)
下載結(jié)束實(shí)例化webimage的時(shí),sdimagecache中有變量表示圖片緩存的最大值和過期時(shí)間
4.kvo能監(jiān)聽數(shù)組么?
可以監(jiān)聽可變數(shù)組的長(zhǎng)度變化,但是不能監(jiān)聽到數(shù)組里面某一個(gè)對(duì)象的變化,不能使用array addobject的方式添加,要使用array [mutableArrayValueForKeyPath:@“dataArray”]
5.gcd的源碼理解
注意常用的幾個(gè)api,匯總group,順序執(zhí)行barrir
6.masonry如何使用鏈?zhǔn)秸Z法對(duì)autolayout進(jìn)行封裝的?
make.centerX.mas……()點(diǎn)語法實(shí)現(xiàn),通過屬性的方式實(shí)現(xiàn)多級(jí)的調(diào)用,調(diào)用的方法是對(duì)象的block屬性。將block作為屬性進(jìn)行訪問、block的返回參數(shù)是自定義對(duì)象
7.如何自己實(shí)現(xiàn)cell高度緩存,autolayout使用系統(tǒng)計(jì)算高度有什么問題?
tableview設(shè)置了UITableViewAutomaticDimension之后autolayout會(huì)自動(dòng)計(jì)算cell的高度但是不會(huì)緩存這個(gè)高度值,在cellforrowatindexpath中計(jì)算高度做緩存。cellforrow與heightforrow的調(diào)用順序:設(shè)置了預(yù)估高度前者在前、否則后者在前會(huì)輪訓(xùn)一遍計(jì)算contentsize
8.tableview優(yōu)化,設(shè)置透明度是怎么影響gpu性能的?
tableview的cell復(fù)用,緩存cell的高度不用每次都要計(jì)算,計(jì)算的時(shí)候放在異步線程中,圖片異步加載,緩存資源,懶加載,布局的時(shí)候不要太多層級(jí),不要?jiǎng)討B(tài)的添加subview提前添加完畢然后控制顯影 因?yàn)槊看翁砑又髸?huì)重新布局autolay消耗性能,減少繪圖操作;預(yù)渲染圖像,不要使用透明背景會(huì)導(dǎo)致混合操作(gpu負(fù)責(zé)),這個(gè)過程很耗時(shí)
9.iOS9之前tableview的代理為啥用assign?
之前的delegate需要在dealloc中對(duì)代理設(shè)置為nil,
assign修飾delegate不對(duì)引用計(jì)數(shù)操作,使用之后沒有設(shè)置為nil可能會(huì)產(chǎn)生野指針,而weak會(huì)自動(dòng)設(shè)置為nil。
10.runtime使用場(chǎng)景有哪些?
方法交換,獲取屬性列表方法列表,動(dòng)態(tài)創(chuàng)建類創(chuàng)建屬性。。。
11.jsonmodel實(shí)現(xiàn)細(xì)節(jié)
12.如何避免外界通過kvc訪問成員變量?
將accessInstanceVariablesDirectlygetter方法返回NO,
kvc本質(zhì)上是操作方法列表以及在內(nèi)存中查找實(shí)例變量,可以利用此特性訪問類的私有變量。
14.coretext,coreimage如何使用
15.gcd如何去取消一個(gè)正在執(zhí)行的請(qǐng)求任務(wù)
ios8之后可以調(diào)用dispatch_block_cancel來取消還沒有執(zhí)行的任務(wù)
模擬NSOperationQueue定義外部變量,用來標(biāo)記block是否需要取消,即外部變量為NO時(shí),可以在block里面返回(感覺這個(gè)操作沒什么意義)
16.NSOperationQueue 添加的任務(wù)默認(rèn)是怎么執(zhí)行,同步還是異步
可設(shè)置優(yōu)先級(jí)(operation設(shè)置完依賴之后再比較優(yōu)先級(jí)),并發(fā)數(shù)量
NSOperation默認(rèn)是同步執(zhí)行,將operation添加到隊(duì)列中是異步執(zhí)行的,給operation添加依賴 addDependency,即在其他operation執(zhí)行完之后在執(zhí)行
17.[obj someMethod],oc方法調(diào)用的原理是什么?
oc中方法調(diào)用最終轉(zhuǎn)換成runtime的c語言函數(shù)objc_msgSend(id receiver,SEL op,),信息發(fā)送后會(huì)在receiver類對(duì)象的方法列表中找這個(gè)方法。
首先去該類的cache中查詢,找到返回;沒找到就去methodlist中查找,找到就將方法的IMP返回并將IMP存入cache中;如果還沒有找到,通過super_calss找到父類,在父類的methodlist中查找;如果父類中沒有找到進(jìn)行動(dòng)態(tài)決議和消息轉(zhuǎn)發(fā);如果動(dòng)態(tài)決議和消息轉(zhuǎn)發(fā)返回NO和nil,就拋出異常
18.NSOperationQueue 中的串行指的是最大并發(fā)數(shù)為1,默認(rèn)是-1即并行
19.NSOperationQueue中執(zhí)行完A,B 再去執(zhí)行C任務(wù)如何實(shí)現(xiàn)
可以對(duì)任務(wù)設(shè)置依賴
20.靜默推送
iOS7之后在后臺(tái)任務(wù)增加了特性:后臺(tái)獲取、推送喚醒、后臺(tái)傳輸。
需求:在應(yīng)用退到后臺(tái)時(shí)某一個(gè)時(shí)間點(diǎn)喚醒設(shè)備更新UI,在用戶下次點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入應(yīng)用的時(shí)候就能看到已經(jīng)更新好的UI了。
后臺(tái)的格式:增加content-available字段并設(shè)成1;alert字段必須為空否則收到的就不是靜默推送;sound字段不影響靜默推送,看需求是否需要。
總結(jié):相當(dāng)于應(yīng)用在后臺(tái)的時(shí)候app中收到推送回調(diào),在沒有打開app的前提下去做一些操作,例如刷新UI等,Xcode中需要設(shè)置remote notifications
21.用c創(chuàng)建的對(duì)象arc下需要自己去釋放嗎?
用free()去釋放
22.udp服務(wù)器如何發(fā)送消息,是否是面向連接
23.項(xiàng)目中遇到哪些難題,上架是否遇到過問題?
項(xiàng)目難題:
上架問題:?jiǎn)?dòng)圖片含有蘋果的logo直接被打回;
上架勾選了內(nèi)購(gòu)但是沒有開發(fā)內(nèi)購(gòu)功能;符合內(nèi)購(gòu)的功能模塊確使用了第三方支付;
24.混合開發(fā)時(shí),客戶端的登錄狀態(tài)如何同步到h5頁(yè)面?
可以通過webjsbridge約定一個(gè)方法,在app登錄成功的時(shí)候通知h5去登錄
app中的登錄信息其實(shí)就是一個(gè)token值,可以將token或者用戶id傳遞給h5.
傳遞之前清理一下h5的地址對(duì)應(yīng)的cookie(遍歷cookie單例找到改url對(duì)應(yīng)cookie并刪除);
加載html的時(shí)候講token通過cookie傳遞過去(在包裝request的時(shí)候設(shè)置進(jìn)去);
25.weak的原理是什么,知道多少說多少?
weak是Runtime維護(hù)了一個(gè)hash(哈希)表,用于存儲(chǔ)指向某個(gè)對(duì)象的所有weak指針。weak表其實(shí)是一個(gè)hash(哈希)表,Key是所指對(duì)象的地址,Value是weak指針的地址(這個(gè)地址的值是所指對(duì)象指針的地址)數(shù)組。
26.wk與webview區(qū)別?
wkwebview有更多的h5特性,更高的滾動(dòng)刷新率內(nèi)置手勢(shì)
27.autolayout布局的view,如何在自己.m文件中獲取寬高以便子視圖根據(jù)條件布局?
可以在layoutsubviews里面獲取
28.xr的適配 設(shè)備唯一標(biāo)示怎么獲取 不用uidevice 蘋果貌似禁止了?
注意安全區(qū)safeArea,設(shè)備尺寸宏定義。[NSUUID UUID].UUIDString動(dòng)態(tài)id,每次生成的id都不一樣,udid/Mac地址/openudid 都被蘋果禁止了,蘋果不允許訪問用戶唯一的隱私數(shù)據(jù)。
29.表情是怎么實(shí)現(xiàn)的,本地存儲(chǔ)?還有表情是如何展示的(圖文混排怎么做)?
本地需要兩個(gè)字典,表情圖片字典、表情含義字典。圖文混排使用yykit
30.cache目錄下文件如何緩存的 跟tmp目錄下的文件有什么區(qū)別?
用戶生成的文件、其他數(shù)據(jù)及其他程序不能重新創(chuàng)建的文件,應(yīng)該保存在/Documents目錄下面,并將通過iCloud自動(dòng)備份,可以重新下載或者重新生成的數(shù)據(jù)保存在/Library /caches目錄下面,不備份。
tmp下的文件系統(tǒng)會(huì)根據(jù)情況將其清空 可能是內(nèi)存不足的時(shí)候也可能是其他時(shí)候
31.ios怎么去管理一個(gè)線程的生命周期?
可以監(jiān)控線程查看runloop處于什么mode
32.如何解決內(nèi)存暴漲問題?
創(chuàng)建對(duì)象的時(shí)候控制一次性創(chuàng)建的數(shù)量,創(chuàng)建完成回收該內(nèi)存空間
33.fmdb如何解決多線程問題?
使用FMDatabaseQueue 思路是:創(chuàng)建一個(gè)隊(duì)列,然后將放入隊(duì)列的block順序執(zhí)行,這樣避免了多線程同時(shí)訪問數(shù)據(jù)庫(kù);每個(gè)線程使用同一個(gè)Queue實(shí)例