1.Block相關(guān)問(wèn)題:
1.Block為什么要用copy
block創(chuàng)建時(shí)默認(rèn)分配內(nèi)存在棧上云矫,不是在堆善涨,作用域?qū)嵲趧?chuàng)建時(shí)的作用域其骄,在作用域外就會(huì)崩潰,所以要拷貝在堆上腊满,在堆上才能使用本地變量
2.Block為什么不用retain
retain只是增加一次計(jì)數(shù)2套么,并沒有把內(nèi)存拷貝到堆上,還是會(huì)被回收
3.為什么進(jìn)入block中的對(duì)象引用計(jì)數(shù)需要自動(dòng)加1
block并不知道對(duì)象什么時(shí)候被釋放碳蛋,所以為了避免在使用block之前對(duì)象就被釋放胚泌,所以block就retain一次
4.Block中self的循環(huán)引用
因?yàn)閎lock需要使用copy到堆區(qū),對(duì)象self就會(huì)被retain一次肃弟,會(huì)造成循環(huán)引用
解決辦法:
在MRC下使用__block,在ARC下玷室,使用__unsafe_unretained\weak修飾
2.@class,#import<> 跟 #import””有什么區(qū)別笤受?
.#import會(huì)鏈入該頭文件的全部信息穷缤,包括實(shí)體變量和方法等;二@class只是告訴編譯器感论,其后面聲明的名稱是類的名稱,至于這些類如何定義的紊册,暫時(shí)不用考慮
.#import<>用來(lái)包含系統(tǒng)自帶的文件比肄,#import""用來(lái)包含自定義的文件
3.frame 和 bounds 有什么不同?
frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小囊陡。(參照點(diǎn)是父view的坐標(biāo)系統(tǒng))
bounds指的是:該view在本身坐標(biāo)系統(tǒng)中的位置和大小芳绩。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))
4.@property = ivar + getter + setter;
“屬性” (property)有兩大概念:ivar(實(shí)例變量)、getter+setter(存取方法)
5.iOS如何內(nèi)存管理
Objective-C的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))撞反、MRC手動(dòng)內(nèi)存計(jì)數(shù)妥色、內(nèi)存池
1.自動(dòng)內(nèi)存計(jì)數(shù)ARC:由Xcode自動(dòng)在App編譯階段,在代碼中添加內(nèi)存管理代碼遏片。
2.手動(dòng)內(nèi)存計(jì)數(shù)MRC:遵循內(nèi)存誰(shuí)申請(qǐng)嘹害、誰(shuí)釋放;誰(shuí)添加吮便,誰(shuí)釋放的原則笔呀。
3.內(nèi)存釋放池Release Pool:把需要釋放的內(nèi)存統(tǒng)一放在一個(gè)池子中,當(dāng)池子被抽干后(drain)髓需,池子中所有的內(nèi)存空間也被自動(dòng)釋放掉许师。內(nèi)存池的釋放操作分為自動(dòng)和手動(dòng)。自動(dòng)釋放受runloop機(jī)制影響。
6.OC創(chuàng)建線程方法
一共三種:GCD 微渠,NSThread搭幻,NSOperationQueue
7.iOS反射機(jī)制
假設(shè)有一天公司產(chǎn)品要實(shí)現(xiàn)一個(gè)需求:根據(jù)后臺(tái)推送過(guò)來(lái)的數(shù)據(jù),進(jìn)行動(dòng)態(tài)頁(yè)面跳轉(zhuǎn)逞盆,跳轉(zhuǎn)到頁(yè)面后根據(jù)返回到數(shù)據(jù)執(zhí)行對(duì)應(yīng)的操作檀蹋。可以采用反射機(jī)制來(lái)用
反射有三種纳击,類(NSStringFromSelector和NSSelectorFromString)续扔,方法(NSStringFromClass和NSClassFromString),協(xié)議反射(NSStringFromProtocol和NSProtocolFromString)
例如:1.class反射 通過(guò)類名的字符串形式實(shí)例化對(duì)象焕数。 Class class=NSClassFromString(@"student");Student*stu=[[class alloc]init];將類名變?yōu)樽址? Class class=[Student class];NSString*className=NSStringFromClass(class);2.SEL的反射 通過(guò)方法的字符串形式實(shí)例化方法纱昧。 SEL selector=NSSelectorFromString(@"setName");[stu performSelector:selector withObject:@"Mike"];將方法變成字符串。NSStringFromSelector(@selector*(setName:));
8.@public堡赔,@protected识脆,@private,@package 聲明各有什么含義善已?
@public任何地方都能訪問(wèn);@protected該類和子類中訪問(wèn),是默認(rèn)的;@private只能在本類中訪問(wèn);@package 本包內(nèi)使用,跨包不可以灼捂。
9.UIScrollView大概是如何實(shí)現(xiàn)的,它是如何捕捉换团、響應(yīng)手勢(shì)的悉稠?
攔截了touch 事件,如果在150ms中未移動(dòng)艘包,把touch事件傳遞給內(nèi)部view的猛,如果產(chǎn)生移動(dòng),則滾動(dòng)想虎,如果在150ms中未移動(dòng)但是移動(dòng)足夠遠(yuǎn)的話卦尊,且canCancelContentTouches = YES,UIScrollView會(huì)調(diào)用touchesCancelled方法舌厨,cancel掉內(nèi)部view的事件響應(yīng),并開始scrolling
10.常用的設(shè)計(jì)模式
代理岂却,觀察者,單例裙椭,策略躏哩,工廠模式
11.推送的過(guò)程
1.應(yīng)用服務(wù)提供商從服務(wù)器端把要發(fā)送的消息和設(shè)備令牌(device token)發(fā)送給蘋果的消息推送服務(wù)器APNs。
2.APNs根據(jù)設(shè)備令牌在已注冊(cè)的設(shè)備(iPhone揉燃、iPad震庭、iTouch、mac等)查找對(duì)應(yīng)的設(shè)備你雌,將消息發(fā)送給相應(yīng)的設(shè)備器联。
3.客戶端設(shè)備接將接收到的消息傳遞給相應(yīng)的應(yīng)用程序二汛,應(yīng)用程序根據(jù)用戶設(shè)置彈出通知消息。
12.假如Controller太臃腫拨拓,如何優(yōu)化肴颊?
1.將網(wǎng)絡(luò)請(qǐng)求抽象到單獨(dú)的類中,方便處理公共邏輯渣磷,處理緩存婿着,做對(duì)象持久化
2.界面封裝抽象到專門類中,構(gòu)造UIView的子類醋界,負(fù)責(zé)控件拼裝
3.構(gòu)造viewModel竟宋,把vc傳遞給view數(shù)據(jù)的過(guò)程,構(gòu)造成viewmodel
4.專門構(gòu)造存儲(chǔ)類形纺,專門處理本地?cái)?shù)據(jù)存取
5.整合常量
十三.網(wǎng)絡(luò)層如何做安全處理
1.盡量使用https
2.不要傳輸明文密碼
3.post并不比get安全
4.不要使用301跳轉(zhuǎn)丘侠,容易被劫持,一定要使用請(qǐng)確保在http環(huán)境下并且做證書綁定校驗(yàn)
5.http請(qǐng)求帶上MAC
6.http請(qǐng)求使用臨時(shí)密鑰
7.AES使用CBC模式
十五:TCP/IP的三次握手和四次揮手
三次握手:client向server發(fā)送SYN報(bào)文逐样,服務(wù)器接收后發(fā)送SYN+ACK報(bào)文蜗字,客戶端接收到報(bào)文后向服務(wù)器發(fā)送ACK報(bào)文,此時(shí)客戶端進(jìn)入SYN_SENT狀態(tài)脂新,服務(wù)器接收到ACK報(bào)文后服務(wù)器進(jìn)入SYN_RECV狀態(tài)
四次揮手:客戶端向服務(wù)器發(fā)送FIN報(bào)文挪捕,服務(wù)器接收后向付出ACK報(bào)文,客戶端接收ACK報(bào)文后争便,服務(wù)器關(guān)閉連接后悔發(fā)送FIN報(bào)文給客戶端级零,客戶端接收FIN報(bào)文后,向客戶端發(fā)送ACK報(bào)文滞乙,關(guān)閉連接