面試題整理二

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等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奕翔,一起剝皮案震驚了整個濱河市裕寨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌派继,老刑警劉巖宾袜,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驾窟,居然都是意外死亡庆猫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門绅络,熙熙樓的掌柜王于貴愁眉苦臉地迎上來月培,“玉大人,你說我怎么就攤上這事恩急∩夹螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵衷恭,是天一觀的道長此叠。 經(jīng)常有香客問我,道長匾荆,這世上最難降的妖魔是什么拌蜘? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮牙丽,結(jié)果婚禮上简卧,老公的妹妹穿的比我還像新娘。我一直安慰自己烤芦,他們只是感情好举娩,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般铜涉。 火紅的嫁衣襯著肌膚如雪智玻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天芙代,我揣著相機與錄音吊奢,去河邊找鬼。 笑死纹烹,一個胖子當著我的面吹牛页滚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铺呵,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼裹驰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了片挂?” 一聲冷哼從身側(cè)響起幻林,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音念,沒想到半個月后沪饺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡症昏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年随闽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝谭。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡掘宪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攘烛,到底是詐尸還是另有隱情魏滚,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布坟漱,位于F島的核電站鼠次,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芋齿。R本人自食惡果不足惜腥寇,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望觅捆。 院中可真熱鬧赦役,春花似錦、人聲如沸栅炒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乙漓,卻和暖如春级历,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叭披。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工寥殖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涩蜘。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓扛禽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皱坛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計模式是什么豆巨? 你知道哪些設(shè)計模式剩辟,并簡要敘述? 設(shè)計模式是一種編碼經(jīng)驗往扔,就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 734評論 0 4
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,124評論 29 470
  • 1.Difference between shallow copy and deep copy? 淺復制和深復制的...
    用心在飛閱讀 989評論 0 9
  • OC的理解與特性O(shè)C作為一門面向?qū)ο蟮恼Z言贩猎,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承萍膛、多態(tài)吭服。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 511評論 0 0
  • 很多情感類文章多用這個名字,這里我想說的是銷售類內(nèi)容蝗罗。 林總是個老司機艇棕,從事食品代理多年,號稱網(wǎng)絡(luò)健全實...
    34d8543dc530閱讀 329評論 0 0