41.+load和+initialize區(qū)別是什么?
Apple的文檔很清楚地說明了initialize和load的區(qū)別在于:load是只要類所在文件被引用就會被調(diào)用,而initialize是在類或者其子類的第一個方法被調(diào)用前調(diào)用。所以如果類沒有被引用進項目贷腕,就不會有l(wèi)oad調(diào)用廷痘;但即使類文件被引用進來费彼,但是沒有使用隙袁,那么initialize也不會被調(diào)用痰娱。
它們的相同點在于:方法只會被調(diào)用一次弃榨。
文檔也明確闡述了方法調(diào)用的順序:父類(Superclass)的方法優(yōu)先于子類(Subclass)的方法菩收,類中的方法優(yōu)先于類別(Category)中的方法
42.怎么樣可以使ViewController瘦下來?
使用MVC模式可以達到幫VC瘦身鲸睛,可以到到提高復用性和可維護性的效果娜饵,同時也會讓原本一個整體的業(yè)務(wù)代碼,分散到各個不同的地方官辈。
(此處只需要了解)進過MVC分層的好處:
1箱舞、VC代碼量驟降,易于維護
可以看到拆分后VC中就僅剩下事件的響應(yīng)操作了拳亿,所有顯示相關(guān)的東西都被單獨抽取出來晴股,所有的網(wǎng)絡(luò)請求以及數(shù)據(jù)緩存都被提取到出去了。
2肺魁、復用性提高
拆分后如果App需要對UI展示進行大改电湘,那么你的改動基本上都會停留在View模塊中,你可以選擇在現(xiàn)有的基礎(chǔ)上改鹅经,也可以選擇從寫一個寂呛。只要業(yè)務(wù)不變的話,Model和VC模塊完全不需要修改瘾晃。這樣改動的范圍較小贷痪,對開發(fā)和測試都比較友好。
43.什么情況下會發(fā)生內(nèi)存泄漏和內(nèi)存溢出例如程序閃退的原因和處理方法
1>當程序在申請內(nèi)存后,,無法釋放已經(jīng)申請的內(nèi)存空間(例如一個對象或者變量使用完成后沒有釋放,這個對對象一直占用著內(nèi)存),一次內(nèi)存泄漏的危害可以忽略,但是內(nèi)存泄露堆積的后果很嚴重,無論多少內(nèi)存,遲早會被占光,內(nèi)存泄露最終會導致內(nèi)存溢出
2>當程序申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)了out of memory;比如申請了一個int,但給他存放了long才能存下的數(shù),就是內(nèi)存溢出.
44.推送的原理個推和極光(自己去看)
45.把程序自己關(guān)掉和程序進入后臺,遠程推送的區(qū)別
1.關(guān)掉后不執(zhí)行任何代碼,不能處理事件
2應(yīng)用程序進入后臺狀態(tài)不久后轉(zhuǎn)入掛起狀態(tài)蹦误。在這種狀態(tài)下劫拢,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時候從內(nèi)存中刪除强胰。只有當用戶再次運行此應(yīng)用舱沧,應(yīng)用才會從掛起狀態(tài)喚醒,代碼得以繼續(xù)執(zhí)行
3.或者進入后臺時開啟多任務(wù)狀態(tài)哪廓,保留在內(nèi)存中狗唉,這樣就可以執(zhí)行系統(tǒng)允許的動作
4.遠程推送是由遠程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序,當應(yīng)用程序收到推送的消息會自動調(diào)用特定的方法執(zhí)行事先寫好的代碼
46.本地通知和遠程推送通知對基本概念和用法
(1)本地通知是由本地應(yīng)用觸發(fā)的,它是基于時間行為的一種通知形式涡真,例如鬧鐘定時分俯、待辦事項提醒肾筐,又或者一個應(yīng)用在一段時候后不使用通常會提示用戶使用此應(yīng)用等都是本地通知。創(chuàng)建一個本地通知通常分為以下幾個步驟:
1)創(chuàng)建UILocalNotification
2)設(shè)置處理通知的時間fireDate
3)配置通知的內(nèi)容:通知主體缸剪、通知聲音吗铐、圖標數(shù)字等
4)配置通知傳遞的自定義數(shù)據(jù)參數(shù)userInfo(這一步可選)
5)調(diào)用通知,可以使用scheduleLocalNotification:按計劃調(diào)度一個通知杏节,也可以使用presentLocalNotificationNow立即調(diào)用通知唬渗。
(2)遠程推送是由應(yīng)用服務(wù)提供商發(fā)起的,通過蘋果的APNs(Apple Push Notification Server)發(fā)送到應(yīng)用客戶端奋渔。
進行簡單的推送知識介紹:
Provider是指某個iPhone軟件的Push服務(wù)器镊逝,APNS是Apple Push Notification Service的縮寫,是蘋果的服務(wù)器嫉鲸。上圖可以分為三個階段:第一階段:應(yīng)用程序把要發(fā)送的消息撑蒜、目的iPhone的標識打包,發(fā)給APNS玄渗。第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中座菠,查找有相應(yīng)標識的iPhone,并把消息發(fā)送到iPhone藤树。第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序浴滴,并且按照設(shè)定彈出Push通知
1、應(yīng)用程序注冊消息推送岁钓。
2升略、iOS從APNS Server獲取device token,應(yīng)用程序接收device token甜紫。
3降宅、應(yīng)用程序?qū)evice
token發(fā)送給PUSH服務(wù)端程序。
4囚霸、服務(wù)端程序向APNS服務(wù)發(fā)送消息腰根。
5、APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序
47.KVC和KVO代理 通知中心block
KVC:(鍵值編碼)是一種簡介訪問對象實例變量的機制拓型,該機制可以不通過存取方法就可以訪問對象的實例變量
KVO:(鍵值觀察)是一種能使得對象獲取到其他對象屬性變化的通知機制
實現(xiàn)KVO鍵值觀察模式额嘿,被觀察的對象必須使用KVC鍵值編碼來修改它的實例變量,這樣才能被觀察著觀察到劣挫。因此册养,KVC是KVO的基礎(chǔ)或者說KVO的實現(xiàn)是建立在KVC的基礎(chǔ)之上的
代理:Delegate與block一般適用于兩個對象1對1之間的通信交互,Delegate需要定義協(xié)議方法压固,代理對象實現(xiàn)協(xié)議方法球拦,并且需要建立代理關(guān)系才可以實現(xiàn)通信。Block更加簡潔,
48.KVO內(nèi)部實現(xiàn)原理坎炼?kvo改變了兩次相同的值愧膀,他還會調(diào)用監(jiān)聽他的方法嗎?
這是通過Objective-C強大的runtime運行時機制實現(xiàn)的谣光。當你第一次觀察某個對象時檩淋,runtime會創(chuàng)建一個新的繼承被監(jiān)聽類的子類。在這個新的類中萄金,它會重寫所有被觀察的key蟀悦,然后將對象的isa指針指向新創(chuàng)建的類。所以對象神奇的變成了新的子類的實例氧敢。這些被重寫的方法中添加了調(diào)用通知觀察者的方法的代碼日戈。當一個對象的一個屬性改變時,會觸發(fā)setKey方法福稳,但這個方法被重寫了涎拉,并且在內(nèi)部添加了發(fā)送通知機制。
49.NSNotification和KVO的區(qū)別和用法是什么的圆?什么時候應(yīng)該使用通知,什么時候應(yīng)該使用KVO半火,它們的實現(xiàn)上有什么區(qū)別嗎越妈?如果用protocol和delegate(或者delegate的Array)來實現(xiàn)類似的功能可能嗎制轰?如果可能结序,會有什么潛在的問題?如果不能玉掸,為什么店归?
1.效率肯定是delegate比nsnotification高阎抒。
2. delegate方法比notification更加直接,最典型的特征是消痛,delegate方法往往需要關(guān)注返回值且叁, 也就是delegate方法的結(jié)果。比如-windowShouldClose:秩伞,需要關(guān)心返回的是yes還是no逞带。所以delegate方法往往包含should這個很傳神的詞。也就是好比你做我的delegate纱新,我會問你我想關(guān)閉窗口你愿意嗎展氓?你需要給我一個答案,我根據(jù)你的答案來決定如何做下一步脸爱。相反的遇汞,notification最大的特色就是不關(guān)心接受者的態(tài)度, 我只管把通告放出來,你接受不接受就是你的事情空入,同時我也不關(guān)心結(jié)果教寂。所以notification往往用did這個詞匯,比如NSWindowDidResizeNotification执庐,那么nswindow對象放出這個notification后就什么都不管了也不會等待接受者的反應(yīng)酪耕。
簡明概要的說明了KVO和NSNotification的區(qū)別:
和delegate一樣,KVO和NSNotification的作用也是類與類之間的通信轨淌,與delegate不同的是1)這兩個都是負責發(fā)出通知迂烁,剩下的事情就不管了,所以沒有返回值递鹉;2)delegate只是一對一盟步,而這兩個可以一對多。這兩者也有各自的特點躏结。
1)KVO的使用:
被觀察者發(fā)出addObserver:forKeyPath:options:context:方法來添加觀察者却盘。
然后只要被觀察者的keyPath值變化(注意:單純改變其值不會調(diào)用此方法,只有通過getters和setters來改變值才會觸發(fā)KVO)媳拴,就會在觀察者里調(diào)用方法observeValueForKeyPath:ofObject:change:context:
因此觀察者需要實現(xiàn)方法observeValueForKeyPath:ofObject:change:context:來對KVO發(fā)出的通知做出響應(yīng)黄橘。
這 些代碼都只需在觀察者里進行實現(xiàn),被觀察者不用添加任何代碼屈溉,所以誰要監(jiān)聽誰注冊塞关,然后對響應(yīng)進行處理即可,使得觀察者與被觀察者完全解耦子巾,運用很靈活很簡便帆赢;但是KVO只能檢測類中的屬性,并且屬性名都是通過NSString來查找线梗,編譯器不會幫你檢錯和補全椰于,純手敲所以比較容易出錯。
2)NSNotification的使用
這里的通知不是由被觀察者發(fā)出仪搔,而是由NSNotificationCenter來統(tǒng)一發(fā)出瘾婿,而不同通知通過唯一的通知標識名notificationName來區(qū)分,標識名由發(fā)送通知的類來起僻造。
首先被觀察者自己在必要的方法A里憋他,通過方法postNotificationName:object:來發(fā)出通知notificationName這樣發(fā)送通知者這邊的工作就完成了,每次A被調(diào)用髓削,就會發(fā)送一次通知notificationName竹挡。
然后誰要監(jiān)聽A的變化,就通過[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:為觀察者注冊監(jiān)聽name為notificationName的通知然后每次發(fā)出name為notificationName的通知時立膛,注冊監(jiān)聽后的觀察者就會調(diào)用其自己定義的方法notificationSelector來進行響應(yīng)揪罕。
NSNotification的特點呢梯码,就是需要被觀察者先主動發(fā)出通知,然后觀察者注冊監(jiān)聽后再來進行響應(yīng)好啰,比KVO多了發(fā)送通知的一步轩娶,但是其優(yōu)點是監(jiān)聽不局限于屬性的變化,還可以對多種多樣的狀態(tài)變化進行監(jiān)聽框往,監(jiān)聽范圍廣鳄抒,使用也更靈活
50.tableView代理方法 的執(zhí)行順序
執(zhí)行順序如下:
第一輪:
1、numberOfSectionsInTableView:假如section=2椰弊,此函數(shù)只執(zhí)行一次许溅,假如section=0,下面函數(shù)不執(zhí)行秉版,默認為1
2贤重、heightForHeaderInSection,執(zhí)行兩次清焕,此函數(shù)執(zhí)行次數(shù)為section數(shù)目
3并蝗、heightForFooterInSection,函數(shù)屬性同上秸妥,執(zhí)行兩次
4滚停、numberOfRowsInSection,此方法執(zhí)行一次
5筛峭、heightForHeaderInSection铐刘,此方法執(zhí)行了兩次,我其實有點困惑為什么這里還要調(diào)用這個方法
6影晓、heightForFooterInSection,此方法執(zhí)行兩次檩禾,
7挂签、numberOfRowsInSection,執(zhí)行一次
8盼产、heightForRowAtIndexPath饵婆,行高,先執(zhí)行section=0戏售,對應(yīng)的row次數(shù)
第二輪:
1侨核、numberOfSectionsInTableView,一次
2灌灾、heightForHeaderInSection搓译,section次數(shù)
3、heightForFooterInSection锋喜,section次數(shù)
4些己、numberOfRowsInSection豌鸡,一次
5、heightForHeaderInSection段标,執(zhí)行section次數(shù)
6涯冠、heightForFooterInSection,執(zhí)行section次數(shù)
7逼庞、numberOfRowsInSection蛇更,執(zhí)行一次
8、heightForRowAtIndexPath赛糟,行高派任,先執(zhí)行一次
9、cellForRowAtIndexPath
10虑灰、willDisplayCell
然后8吨瞎、9、10依次執(zhí)行直到所有的cell被描畫完畢
51.tableView的cell的復用原理
復用機制簡單的說意思一行一行的cell都是在復用的穆咐,滑動tableview的時候颤诀,剛離開視圖的cell會被放到復用池中,等下一個cell需要顯示時对湃,會先看復用池中有沒有cell崖叫,如果有的時候,就從復用池中拿出來cell拍柒,沒有的話就重新創(chuàng)建cell心傀。
52.第三方分享 、 第三方登錄(友盟 自個看去)
53.static和const
對于C/C++語言來講,
const就是只讀的意思,只在聲明中使用;
static一般有2個作用,規(guī)定作用域和存儲方式.對于局部變量,static規(guī)定其為靜態(tài)存儲方式,每次調(diào)用的初始值為上一次調(diào)用的值,調(diào)用結(jié)束后存儲空間不釋放;
對于全局變量,如果以文件劃分作用域的話,此變量只在當前文件可見;對于static函數(shù)也是在當前模塊內(nèi)函數(shù)可見.
static const應(yīng)該就是上面兩者的合集.
下面分別說明:
全局:
const,只讀的全局變量,其值不可修改.
static,規(guī)定此全局變量只在當前模塊(文件)中可見.
static const,既是只讀的,又是只在當前模塊中可見的.
文件:
文件指針可當作一個變量來看,與上面所說類似.
函數(shù):
const,返回只讀變量的函數(shù).
static,規(guī)定此函數(shù)只在當前模塊可見.
54.SDWebImage的原理
SDWebImage實現(xiàn)原理:
1.首先讓占位圖先顯示拆讯。
2.SDWebImageManage交給SDImageCache先從內(nèi)存中查找是否有圖片脂男,會以URL作為數(shù)據(jù)的索引在內(nèi)存中查找是否有對應(yīng)的緩存。
3.如果有緩存种呐,通過代理進行回調(diào)展示圖片宰翅。
4.如果內(nèi)存緩存中沒有找到,生成NSInvocationOperation添加到隊列爽室,會通過MD5處理過的key來硬盤中查詢是否有圖片汁讼。
5.如果找到了,就把硬盤中的數(shù)據(jù)加載到內(nèi)存中并顯示阔墩。
6.如果沒有找到嘿架,會生成一個下載器向遠程服務(wù)器發(fā)出請求開始下載圖片。
7.圖片下載由NSURLConnection來做啸箫,實現(xiàn)相關(guān)delegate來判斷圖片下載中耸彪、下載完成和下載失敗。
8.下載后的圖片會被保存到內(nèi)存和硬盤筐高。
9.進行界面展示搜囱。
55.SDWebImage的最大線程數(shù)丑瞧,可不可以修改?
最大線程數(shù)(6)可以修改
55.SDWebImage具體如何實現(xiàn)
SDWebImage內(nèi)部實現(xiàn)過程
入口setImageWithURL:placeholderImage:options:會先把placeholderImage顯示蜀肘,然后SDWebImageManager根據(jù)URL開始處理圖片绊汹。
進入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給SDImageCache從緩存查找圖片是否已經(jīng)下載queryDiskCacheForKey:delegate:userInfo:.
先從內(nèi)存圖片緩存查找是否有圖片扮宠,如果內(nèi)存中已經(jīng)有圖片緩存西乖,SDImageCacheDelegate回調(diào)imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。
SDWebImageManagerDelegate回調(diào)webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示圖片坛增。
如果內(nèi)存緩存中沒有获雕,生成NSInvocationOperation添加到隊列開始從硬盤查找圖片是否已經(jīng)緩存。
根據(jù)URLKey在硬盤緩存目錄下嘗試讀取圖片文件收捣。這一步是在NSOperation進行的操作届案,所以回主線程進行結(jié)果回調(diào)notifyDelegate:。
如果上一操作從硬盤讀取到了圖片罢艾,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小楣颠,會先清空內(nèi)存緩存)。SDImageCacheDelegate回調(diào)imageCache:didFindImage:forKey:userInfo:咐蚯。進而回調(diào)展示圖片童漩。
如果從硬盤緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片春锋,需要下載圖片矫膨,回調(diào)imageCache:didNotFindImageForKey:userInfo:。
共享或重新生成一個下載器SDWebImageDownloader開始下載圖片期奔。
圖片下載由NSURLConnection來做侧馅,實現(xiàn)相關(guān)delegate來判斷圖片下載中、下載完成和下載失敗呐萌。
56.ARC和MRC的區(qū)別
Objective-c中提供了兩種內(nèi)存管理機制MRC(MannulReference
Counting)和ARC(Automatic Reference Counting)施禾,分別提供對內(nèi)存的手動和自動管理,來滿足不同的需求搁胆。其實arc內(nèi)部機制原理也是來源于mrc,arc是在iOS 5/ Mac OS X 10.7開始導入邮绿,利用Xcode4.2可以使用該機能渠旁。arc的首要目的就是讓代碼簡潔化,編程簡單化船逮,開發(fā)更順心應(yīng)手顾腊,減少不必要的小問題小疏忽;顧名思義挖胃,自動引用計數(shù)管理杂靶,關(guān)于內(nèi)存的申請梆惯,使用和釋放過程都交給系統(tǒng)自動實現(xiàn),我們可也不用關(guān)系里面的過程吗垮,但是事實上還是mrc的原理垛吗,只是是系統(tǒng)幫我們做了管理;
mrc烁登,手動引用計數(shù)器管理怯屉,是在我們申請到某一塊內(nèi)存,在使用之后饵沧,要手動釋放锨络,釋放機理涉及到計數(shù)器問題,如果未釋放內(nèi)存狼牺,會造成內(nèi)存的浪費羡儿,俗稱內(nèi)存泄露,甚至引起很多未知的錯誤結(jié)果是钥,這對程序有威脅很大掠归,但是,何時釋放咏瑟,怎么釋放拂到,注意哪些問題,很有講究码泞,這就是mrc的不便之處兄旬,也是蘋果推出arc的緣由;
mrc的具體機理余寥,計數(shù)器是什么领铐,在程序過程中的變化,在達到什么程度會釋放內(nèi)存宋舷,怎么操作绪撵;建議查閱相關(guān)文檔;
mrc祝蝠,在代碼上下形式主要表現(xiàn)為音诈,調(diào)用該對象時,要做retain操作绎狭,使用完成后要release细溅,最后還要重寫dealloc方法,對該類的所有對象做釋放儡嘶,所以在mrc的代碼會有autorelease喇聊,retain,release等詞語蹦狂,
而arc不允許有這些詞匯誓篱,應(yīng)為這些操作都由系統(tǒng)自動完成朋贬。
引用計數(shù)器
1.和內(nèi)存管理相關(guān)的方法
1)alloc引用計數(shù)器自動設(shè)為1
2)retain引用計數(shù)器+1返回了經(jīng)過+1以后的當前實例對象
3)release引用計數(shù)器-1,并不一定是釋放
4)retainCount獲取引用計數(shù)器的值
5)dealloc當實例對象被銷毀之前窜骄,系統(tǒng)自動調(diào)用锦募。
一定要調(diào)[super dealloc]
和內(nèi)存管理相關(guān)的名詞
1)僵尸對象:此對象被銷毀,不能再使用啊研,不能給它發(fā)送任何消息
2)野指針:指向僵尸對象(不可用的內(nèi)存)的指針御滩,給野指針發(fā)送消息將會產(chǎn)生不可控的后果。
3)空指針:沒有指向任何對象的指針党远,給空指針發(fā)消息不會產(chǎn)生任何行為
內(nèi)存管理原則
1.如果你想持有某個對象削解,就必須負責讓做一次retain操作,引用計數(shù)器+1.
2.如果你想放棄對某個對象的持有權(quán)沟娱,就要負責讓其做一次release操作氛驮,引用計數(shù)器-1.
3.誰retain,誰release
57.自動釋放池自動釋放池什么時候釋放
自動釋放池(Autorelease pool)是OC的一種內(nèi)存自動回收機制济似,可以將一些臨時變量通過自動釋放池來回收統(tǒng)一釋放
在每一個事件周期(event cycle)的開始矫废,系統(tǒng)會自動創(chuàng)建一個自動釋放池;在每一個事件周期的結(jié)尾砰蠢,系統(tǒng)會自動銷毀這個自動釋放池蓖扑。一般情況下,你可以理解為:當你的代碼在持續(xù)運行時台舱,自動釋放池是不會被銷毀的律杠,這段時間內(nèi)你也可以安全地使用自動釋放的對象;當你的代碼運行告一段落竞惋,開始等待用戶輸入(或者其它事件)時柜去,自動釋放池就會被釋放掉,池中的對象都會收到一個release消息拆宛,有的可能會因此被銷毀嗓奢。
這是很難確定的時間,如果自動釋放池的銷毀時間過早浑厚,那么程序就很危險股耽,這個恐怕很難滿足程序員的要求吧。
自動釋放池的缺點:它延緩了對象的釋放钳幅,在有大量自動釋放的對象時豺谈,會占用大量內(nèi)存資源。因此贡这,你需要避免將大量對象自動釋放。并且厂榛,在以下兩種情況下盖矫,你需要手動建立并手動銷毀掉自動釋放池:
1.當你在主線程外開啟其它線程時:系統(tǒng)只會在主線程中自動生成并銷毀掉自動釋放池丽惭。
2.當你在短時間內(nèi)制造了大量自動釋放對象時:及時地銷毀有助于有效利用設(shè)備上有限地內(nèi)存資源。
58.真機(自己回去看去)
59.pch怎么配置
pch需要提前編譯在buildSettings中的搜索框中搜索prefix header將precompile prefix header改為yes并將pch所在的工程的目錄和pct的文件名寫上
60.AFNetWorking怎么封裝(一般不會問)
實現(xiàn)AFNetworking的高封裝
//1.將AFNetworking的業(yè)務(wù)封裝到了MyHttpDownLoad類中(.h和.m文件已給出)賦值即可使用
//2.調(diào)用方法-(void)testAFNetworking;該方法中的網(wǎng)址是我內(nèi)網(wǎng)的網(wǎng)址,使用者可以換成自己的JSON請求的網(wǎng)址
//3.最后APPDelegate中還要寫一句[[AFNetworkReachabilityManager sharedManager] startMonitoring];監(jiān)聽網(wǎng)絡(luò)狀態(tài)APPDelegate里還要設(shè)置一下
//監(jiān)聽網(wǎng)絡(luò)狀態(tài),只調(diào)用一次
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
#import
@interface MyHttpDownLoad : NSObject
//cb callback回調(diào)
+(void) download:(NSString *)urlpathparam:(NSDictionary *)dict finish:( void (^)(NSData *data,NSDictionary *obj,NSError *error))cb;
@end
#import "MyHttpDownLoad.h"
#import "AFNetworking.h"
static BOOL isFirst = NO;
static BOOL canCHeckNetwork = NO;
@implementation MyHttpDownLoad
+(void) download:(NSString *)urlpathparam:(NSDictionary *)dict finish:(void (^)(NSData *,NSDictionary *obj, NSError*))cb{
//1..檢查網(wǎng)絡(luò)連接(蘋果公司提供的檢查網(wǎng)絡(luò)的第三方庫Reachability)
//AFN在Reachability基礎(chǔ)上做了一個自己的網(wǎng)絡(luò)檢查的庫,基本上一樣
if (isFirst == NO) {
//網(wǎng)絡(luò)只有在startMonitoring完成后才可以使用檢查網(wǎng)絡(luò)狀態(tài)
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManagersharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatusstatus) {
canCHeckNetwork = YES;
}];
isFirst = YES;
}
//只能在監(jiān)聽完善之后才可以調(diào)用
BOOL isOK = [[AFNetworkReachabilityManager sharedManager] isReachable];
//BOOL isWifiOK = [[AFNetworkReachabilityManager sharedManager]isReachableViaWiFi];
//BOOL is3GOK = [[AFNetworkReachabilityManagersharedManager]isReachableViaWWAN];
//網(wǎng)絡(luò)有問題
if(isOK == NO && canCHeckNetwork == YES){
NSError *error = [NSError errorWithDomain:@"網(wǎng)絡(luò)錯位" code:100 userInfo:nil];
cb(nil, nil,error);
return;
}
//2..實現(xiàn)解析
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:urlpath parameters:dict success:^(NSURLSessionDataTask*task, id responseObject) {
//成功cb是對方傳遞過來的對象這里是直接調(diào)用
NSDictionary *obj = [NSJSONSerialization JSONObjectWithData:responseObjectoptions:NSJSONReadingMutableContainers error:nil];
cb(responseObject, obj ,nil);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
//失敗
cb(nil, nil ,error);
}];
};
@end
//2.調(diào)用方式
-(void)testAFNetworking{
NSString *urlPath = @"http://10.0.8.8/sns/my/user_list.php";
NSDictionary *params = @{@"page" : @"10"};
[MyHttpDownLoad download:urlPath param:params finish:^(NSData*data,NSDictionary *obj, NSError *error) {
if (error == nil) {
//obj即為解析后的數(shù)據(jù).
NSLog(@"parase my downloadjson is %@",obj);
}else{
UIAlertView *av = [[UIAlertViewalloc]initWithTitle:@"網(wǎng)絡(luò)狀態(tài)" message:@"親 網(wǎng)絡(luò)不給力"delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[av show];
}
}];
}
61.js交互
JavaScriptBriage互相傳數(shù)據(jù)都會重點在于兩邊都要寫數(shù)據(jù)
62.scrollView??contentOffset
contentInset??contentSize怎么把兩張圖片合成一張
1.-?(UIImage*)addImage:(UIImage*)image1toImage:(UIImage*)image2?{
2.UIGraphicsBeginImageContext(image1.size);
3.
4.//?Draw?image1
5.[image1drawInRect:CGRectMake(0,?0,?image1.size.width,?image1.size.height)];
6.
7.//?Draw?image2
8.[image2drawInRect:CGRectMake(0,?0,?image2.size.width,?image2.size.height)];
9.
10.UIImage*resultingImage?=?UIGraphicsGetImageFromCurrentImageContext();
11.
12.UIGraphicsEndImageContext();
13.
14.returnresultingImage;
15.}
63.CALayer和UIVIew的區(qū)別
兩者最大的區(qū)別是辈双,圖層不會直接渲染到屏幕上责掏,UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是集成自它湃望。它本身完全是由CoreAnimation來實現(xiàn)的换衬。它真正的繪圖部分,是由一個CALayer類來管理证芭。UIVIew本身更像是一個CALayer的管理器瞳浦。一個UIVIew上可以有n個CALayer,每個layer顯示一種東西废士,增強UIVIew的展現(xiàn)能力叫潦。
64.cocoa
pods的命令行
更新:pod update
安裝:pod setup
導入庫:pod install
65.怎么讓一個app長時間不用,怎么自動退出登錄官硝?
每個用戶都有一個自己的uId當你點擊登錄成功的時候 后臺會返回一個sId和uId每次登錄的時候都會 拿上一次后臺返回的sid進行請求如果登錄成功 后臺會返回一個新的sid并且覆蓋上一次登錄的sid如果發(fā)送請求所使用的sid登錄不成功證明此app長時間沒用sid過期重新登錄sid過期沒過期是后臺寫的 時間戳
66.進程和線程的區(qū)別矗蕊?線程鎖?列舉cocoa中常見對幾種多線程的實現(xiàn)氢架,并談?wù)劧嗑€程安全的幾種解決辦法及多線程安全怎么控制傻咖?
1>一個程序至少要有進程,一個進程至少有一個線程
2>資源分配的最小獨立單位岖研。就是一個應(yīng)用程序在處理機上的一次執(zhí)行過程卿操,它可以申請和擁有系統(tǒng)資源;進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動缎玫,進程是系統(tǒng)進行分配和調(diào)度的一個獨立單位
3>進程下的一個分支硬纤。是進程的一個實體,是CPU調(diào)度和分派的基本單位赃磨,它是進程更小的能獨立運行的基本單位筝家。線程自己基本上不擁有系統(tǒng)資源。只擁有一點在運行中必不可少的資源(如程序計數(shù)器邻辉、一組寄存器和棧)溪王,但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源
1>只在主線程刷新訪問UI
2>如果要防止資源搶奪,得用synchronized進行加鎖保護
3>如果異步操作要保證線程安全等問題,盡量使用GCD(有些函數(shù)默認就是安全的)
67.線程間怎么通信
線程間通信:在1個進程中值骇,線程往往不是孤立存在的莹菱,多個線程之間需要經(jīng)常進行通信
線程間通信的體現(xiàn)
1個線程傳遞數(shù)據(jù)給另1個線程
在1個線程中執(zhí)行完特定任務(wù)后,轉(zhuǎn)到另1個線程繼續(xù)執(zhí)行任務(wù)
線程間通信常用方法
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thrwithObject:(id)arg waitUntilDone:(BOOL)wait
68.簡單說一下APP的啟動過程,從main文件開始說起
程序啟動分為兩類:1.有storyboard 2.沒有storyboard
有storyboard情況下:
1.main函數(shù)
2.UIApplicationMain
*創(chuàng)建UIApplication對象
*創(chuàng)建UIApplication的delegate對象
3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
*創(chuàng)建UIWindow
*創(chuàng)建和設(shè)置UIWindow的rootViewController
*顯示窗口
沒有storyboard情況下:
1.main函數(shù)
2.UIApplicationMain
*創(chuàng)建UIApplication對象
*創(chuàng)建UIApplication的delegate對象
3.delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
*程序啟動完畢的時候,就會調(diào)用代理的application:didFinishLaunchingWithOptions:方法
*在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
*創(chuàng)建和設(shè)置UIWindow的rootViewController
*顯示窗口
69.鄧白氏編碼吱瘩,幾種證書的區(qū)別道伟?
1.個人開發(fā)者賬號(99美元):可以上架AppStore,不可以打分發(fā)包。不需要鄧白氏碼
2.公司開發(fā)者賬號(99美元):可以上架AppStore蜜徽,不可以打分發(fā)包祝懂,可以添加開發(fā)者成員的apple id,使其賬號加入公司開發(fā)者賬號這個組織拘鞋。需要鄧白氏碼
3.企業(yè)開發(fā)者賬號(299美元):可以打分發(fā)包砚蓬,不可以上架AppStore。需要鄧白氏碼
70. frame與bounds的區(qū)別盆色?Bounds的大小改變frame改變嗎灰蛙?
frame指的是:該view在父view坐標系統(tǒng)中的位置和大小。(參照點是父親的坐標系統(tǒng))
bounds指的是:該view在本身坐標系統(tǒng)中的位置和大小隔躲。(參照點是本身坐標系統(tǒng))
會發(fā)生改變
71.UIView的圓角屬性設(shè)置方法
第一種摩梧,添加圓角都是改變clipsToBounds和layer.cornerRadius,這樣大約兩行代碼就可以解決這個問題.但是,這樣使用這樣的方法會強制Core Animation提前渲染屏幕的離屏繪制,而離屏繪制就會為性能帶來負面影響
第二種 貝塞爾曲線
UIImageView*imageView = [[UIImageViewalloc] initWithFrame:CGRectMake(0,0,100,100)];
imageView.center=CGPointMake(200,300);
UIImage*anotherImage = [UIImageimageNamed:@"image"];
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO,1.0);
[[UIBezierPathbezierPathWithRoundedRect:imageView.boundscornerRadius:50] addClip];
[anotherImage drawInRect:imageView.bounds];
imageView.image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.viewaddSubview:imageView];
72.
awakeFromNib與viewDidLoad區(qū)別
awakeFromNib
當.nib文件被加載的時候,會發(fā)送一個awakeFromNib的消息到.nib文件中的每個對象蹭越,每個對象都可以定義自己的awakeFromNib函數(shù)來響應(yīng)這個消息障本,執(zhí)行一些必要的操作。也就是說通過nib文件創(chuàng)建view對象是執(zhí)行awakeFromNib响鹃。
viewDidLoad
當view對象被加載到內(nèi)存是就會執(zhí)行viewDidLoad驾霜,所以不管通過nib文件還是代碼的方式創(chuàng)建對象都會執(zhí)行viewDidLoad。
73.LayoutSubviews何時會被調(diào)用
當要調(diào)整subViews時候,需要重寫layoutSubviews方法。
1:初始化init方法時候不會觸發(fā)糖埋。
2:滾動UIScrollView時會觸發(fā)
3:旋轉(zhuǎn)UIScreen時會觸發(fā)
4:當改變view的值時候會觸發(fā),前提是frame前后值發(fā)生了變化
5:當改變UIview的大小時候會觸發(fā)
74.#import和#include的區(qū)別@ class代表什么蓉冈?
預(yù)編譯指令
Objective-C:#import
C,C++:#include
#import由gcc編譯器支持
在Objective-C中轩触,#import被當成#include指令的改良版本來使用寞酿。除此之外,#import確定一個文件只能被導入一次脱柱,這使你在遞歸包含中不會出現(xiàn)問題伐弹。
使用哪一個還是由你來決定。一般來說榨为,在導入Objective-C頭文件的時候使用#import惨好,包含C頭文件時使用#include。比如:
#import
#include
#include
#import比起#include的好處就是不會引起交叉編譯
二随闺、@class是用來做類引用的
@class就是告訴編譯器有這么一個類日川,至于類的定義是啥不知道
@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import
75.NSString和NSMutableString的區(qū)別
NSString是一個不可變的字符串對象矩乐。這不是表示這個對象聲明的變量的值不可變龄句,而是表示它初始化以后,你不能改變該變量所分配的內(nèi)存中的值,但你可以重新分配該變量所處的內(nèi)存空間撒璧。而NSMutableString是可變的透葛,意味著你可以追加它的內(nèi)存空間,或者修改它所分配的內(nèi)存空間中的值
76.
socket通信的幾個關(guān)鍵步驟
面向連接的socket通信就像與對方打電話卿樱,首先需要通過電話建立一個連接,連接建立好之后硫椰,彼此才能雙向通信繁调。它有幾個關(guān)鍵步驟
服務(wù)器端通常以守護進程的方式實現(xiàn):
1:創(chuàng)建守護進程
2:獲取或注冊服務(wù)
3:創(chuàng)建socket并綁定地址
4:開始監(jiān)聽
5:接收客戶端連接請求
6:進行數(shù)據(jù)傳輸
客戶端
1:獲取或注冊服務(wù)
2:創(chuàng)建socket
3:發(fā)送連接請求
77.Core Foundation中提供了哪幾種操作Socket的方法?
CFNetwork靶草、CFSocket和BSDSocket
78. 31.用id聲明的對象有什么特性蹄胰?
?沒有*號
?動態(tài)數(shù)據(jù)類型
?可以指向任何類的對象(設(shè)置是nil),而不關(guān)心其具體類型
?在運行時檢查其具體類型
?可以對其發(fā)送任何(存在的)消息
好好看數(shù)據(jù)庫 內(nèi)購微信支付 支付寶支付 環(huán)信 地圖XMPP協(xié)議Socket等