iOS 面試題及答案總結(jié)(目的是給自己以后面試準(zhǔn)備題庫,非盈利,引用的已經(jīng)注明出處了)

1、什么情況使用 weak 關(guān)鍵字,相比 assign 有什么不同?
什么情況使用 weak 關(guān)鍵字?
在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過讓其中一端使用 weak 來解決,比如: delegate、block。
自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再強(qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak,使用 storyboard(xib 不行)創(chuàng)建的 vc,會(huì)有一個(gè)叫 _topLevelObjectsToKeepAliveFromStoryboard 的私有數(shù)組強(qiáng)引用所有 top level 的對(duì)象,所以這時(shí)即便 outlet 聲明成 weak 也沒關(guān)系。當(dāng)然,也可以使用 strong。
weak 和 assign 的不同點(diǎn):

weak、assign 修飾的屬性指向一個(gè)對(duì)象時(shí)都不會(huì)增加對(duì)象的引用計(jì)數(shù)。然而在所指的對(duì)象被釋放時(shí),weak 屬性值會(huì)被置為 nil,而 assign 屬性不會(huì)。
assign 可以用非 OC 對(duì)象以及基本類型,而 weak 必須用于 OC 對(duì)象。

怎么用 copy 關(guān)鍵字?
copy 的語義是將對(duì)象拷貝一份給新的引用,通過新的引用對(duì)它的修改不影響原來那個(gè)被拷貝的對(duì)象。

NSString、NSArray、NSDictionary 等等經(jīng)常使用 copy 關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary。
block 也經(jīng)常使用 copy 關(guān)鍵字。block 使用 copy 是從 MRC 遺留下來的傳統(tǒng),在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū)。在 ARC 中寫不寫都行,對(duì)于 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì) block 進(jìn)行了 copy 操作。

1.怎么用 copy 關(guān)鍵字?

      一般使用 retain 或者 strong 修飾屬性時(shí),是使引用對(duì)象的指針指向同一個(gè)對(duì)象,即為同一塊內(nèi)存地址。只要其中有一個(gè)指針變量被修改時(shí)所有其他引用該對(duì)象的變量都會(huì)被改變。

      而使用 copy 關(guān)鍵字修飾在賦值時(shí)是釋放舊對(duì)象,拷貝新對(duì)象內(nèi)容。重新分配了內(nèi)存地址。以后該指針變量被修改時(shí)就不會(huì)影響舊對(duì)象的內(nèi)容了。

copy 只有實(shí)現(xiàn)NSCopying協(xié)議的對(duì)象類型才有效。

      常用于NSString和Block。

*2.這個(gè)寫法會(huì)出什么問題: @@property (copy) NSMutableArray array;

當(dāng)一個(gè)NSMutableArray對(duì)象使用 initWithArray: 初始化方法創(chuàng)建時(shí),并將該對(duì)象賦值給了array屬性。那么之后array執(zhí)行可變數(shù)組的方法,比如: removeObjectAtIndex: 時(shí)會(huì)出現(xiàn)unrecognized selector sent to instance的崩潰。原因在于array屬性在被賦值(setter)的時(shí)候默認(rèn)執(zhí)行了copy方法后變?yōu)榱瞬豢勺僋SArray對(duì)象。

3.如何讓自己的類用 copy 修飾符?如何重寫帶 copy 關(guān)鍵字的 setter?

      該類必須要實(shí)現(xiàn)NSCopying協(xié)議。實(shí)現(xiàn) - (id)copyWithZone:(NSZone *)zone; 方法。

      重寫copy關(guān)鍵字的setter時(shí),需要調(diào)用一下傳入對(duì)象的copy方法。然后賦值給該setter的方法對(duì)應(yīng)的成員變量。

4.@property 的本質(zhì)是什么?ivar、getter、setter 是如何生成并添加到這個(gè)類中的.

property在編譯時(shí)編譯器會(huì)自動(dòng)的為我們生成一個(gè)私有的成員變量和setter與getter方法的聲明和實(shí)現(xiàn)。反編譯property大致生成五個(gè)東西

      OBJC *IVAR* $類名$屬性名稱 該屬性的偏移量

      setter與getter方法對(duì)應(yīng)的實(shí)現(xiàn)函數(shù)

      ivar_list 就是成員變量列表

      method_list 方法列表

      prop_list 屬性列表

      也就是說我們每次在增加一個(gè)屬性,系統(tǒng)都會(huì)在ivar_list中添加一個(gè)成員變量的描述,在method_list中增加setter與getter方法的描述,在屬性列表中增加一個(gè)屬性的描述,然后計(jì)算該屬性在對(duì)象中的偏移量,然后產(chǎn)生setter與getter方法對(duì)應(yīng)的實(shí)現(xiàn),在setter方法方法中從偏移量的位置開始賦值,在getter方法中從偏移量開始取值,為了能夠讀取正確字節(jié)數(shù),系統(tǒng)對(duì)象偏移量的指針類型進(jìn)行了類型強(qiáng)轉(zhuǎn)。

5.@protocol 和 category 中如何使用 @property

      在protocol中使用property只會(huì)生成setter和getter方法聲明,我們使用屬性的目的,是希望遵守我協(xié)議的對(duì)象的實(shí)現(xiàn)該屬性

      category 使用 @property 也是只會(huì)生成setter和getter方法的聲明,如果我們真的需要給category增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行Objective-C動(dòng)態(tài)運(yùn)行機(jī)制中的兩個(gè)函數(shù):

               objc_setAssociatedObject

               objc_getAssociatedObject

6.@synthesize和@dynamic分別有什么作用?

      @property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是@synthesize,一個(gè)是@dynamic。如果@synthesize和@dynamic都沒寫,那么默認(rèn)的就是@syntheszie var = *var*,*var*為*property*變量??梢允謩?dòng)修改屬性*var*對(duì)應(yīng)的實(shí)例變量。例如:*@syntheszie var =* var1

      @synthesize的語義是如果你沒有手動(dòng)實(shí)現(xiàn)setter方法和getter方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法, 在Xcode4.4之后的版本可以省略不寫.

      @dynamic告訴編譯器不要自動(dòng)生成成員變量的getter和setter方法,而是開發(fā)者自己手工生成或者運(yùn)行時(shí)生成.

7.用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?

      使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用copy無論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本.

      如果使用 strong .這個(gè)屬性有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象被外部意外的修改了,由于可變對(duì)象被改變之后起始地址不會(huì)發(fā)生變化。而附有strong修飾的屬性依然指向這這塊內(nèi)存地址,下次讀取的時(shí)候就會(huì)是被改變以后的對(duì)象了.也就是說如果使用 strong 可能會(huì)被外部意外的修改。

8.objc中向一個(gè)對(duì)象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系?

[obj foo]變量編譯之后就是objc_msgSend()函數(shù)的調(diào)用。該方法編譯后的形式大致如下:objc_msgSend(obj, sel_registerName(“foo”));

9.一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局?(考慮有父類的情況)

每一個(gè)objc對(duì)象都是一個(gè)類的實(shí)例。在Objective-C語言的內(nèi)部,每一個(gè)對(duì)象都有一個(gè)名為isa的指針,指向該對(duì)象的類(類對(duì)象)。每一個(gè)類描述了一系列它的實(shí)例的特點(diǎn),包括成員變量的列表,成員函數(shù)的列表等。每一個(gè)對(duì)象都可以接受消息,而對(duì)象能夠接收的消息列表是保存在它所對(duì)應(yīng)的類對(duì)象中。如下圖:

image

類對(duì)象內(nèi)部還有一個(gè)指向superclass的指針,指向他的父類對(duì)象,根類為NSObject類它的superclass指針指向nil,如下圖:

image

類對(duì)象既然稱為對(duì)象那它也是一個(gè)實(shí)例。類對(duì)象中也有一個(gè)isa指針指向它的元類(meta class),即類對(duì)象是元類的實(shí)例。元類內(nèi)部存放的是類方法列表,根元類的isa指針指向自己,superclass指針指向NSObject類

10.一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用?

objc對(duì)象的isa指針指向類對(duì)象,用于尋找對(duì)象的方法。

11.objc中的類方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系?

類方法

      類方法保存在類對(duì)象的元類中

      類方法只能通過類對(duì)象調(diào)用

      類方法中的self是類對(duì)象

      類方法中不能訪問成員變量

      類方法中不能直接調(diào)用對(duì)象方法

實(shí)例方法

      保存在類對(duì)象的對(duì)象模型中

      實(shí)例方法只能通過實(shí)例對(duì)象調(diào)用

      實(shí)例方法中的self是實(shí)例對(duì)象

      實(shí)例方法中可以訪問成員變量

      實(shí)例方法中可以訪問成員變量

      實(shí)例方法中可以訪問成員變量

12.runtime如何實(shí)現(xiàn)weak變量的自動(dòng)置nil?

/* 編譯器的模擬源代碼 */

id obj1;

objc_initWeak(&obj1, obj);

objc_destroyWeak(&obj1);

通過objc_initWeak函數(shù)初始化附有 weak修飾符的變量,在變量作用域結(jié)束時(shí)通過objc_destoryWeak函數(shù)釋放該變量。objc_initWeak函數(shù)將附有 weak修飾符的變量初始化為0后,將會(huì)賦值的對(duì)象作為參數(shù)調(diào)用objc_storeWeak函數(shù)。

obj1 = 0;

obj_storeWeak(&obj1, obj);

然后obj_destroyWeak函數(shù)將0作為參數(shù)的調(diào)用objc_storeWeak函數(shù)。

obj_destroyWeak(&obj1, 0);

前面的源代碼與下列源代碼相同。

/ * 編譯器的模擬代碼 */

id obj1;

obj1 = 0;

objc_storeWeak&obj1, obj);

objc_storeWeak(&obj1, 0);

objc_storeWeak函數(shù)的第二參數(shù)的賦值對(duì)象的地址作為鍵值,將第一個(gè)參數(shù)的附有__weak修飾符的變量的地址注冊(cè)到weak表中。如果第二參數(shù)為0,則把變量的地址從weak表中刪除。

13._objc_msgForward函數(shù)是做什么的,直接調(diào)用它將會(huì)發(fā)生什么?

這個(gè)沒接觸過,也沒找到相關(guān)資料。但是跟objc動(dòng)態(tài)運(yùn)行機(jī)制中的 forwardingTargetForSelector: 和 forwardInvocation: 方法有點(diǎn)相似。猜測(cè)是該方法編譯后的源碼,都用于消息轉(zhuǎn)發(fā)機(jī)制

14.以+ scheduledTimerWithTimeInterval…的方式觸發(fā)的timer,在滑動(dòng)頁面上的列表時(shí),timer會(huì)暫定回調(diào),為什么?如何解決?

      當(dāng)前主線程的 RunLoop 正在以 UITrackingRunLoopMode 的模式運(yùn)行。 這個(gè)時(shí)候 RunLoop 只會(huì)處理與 UITrackingRunLoopMode “綁定”的源, 比如觸摸、滾動(dòng)等事件;而 NSTimer 是默認(rèn)“綁定”到 NSRunLoopDefaultMode 上的, 所以 Timer 是事情是不會(huì)被 RunLoop 處理的,定時(shí)器被暫停了!

      常見的解決方案是把Timer“綁定”到 NSRunLoopCommonModes 模式上:

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

這樣這個(gè)Timer就可以和當(dāng)前組中的兩種模式 UITrackingRunLoopMode 和 kCFRunLoopDefaultMode 相關(guān)聯(lián)了。 RunLoop在這兩種模式下,Timer都可以正常運(yùn)行了。

15.BAD_ACCESS在什么情況下出現(xiàn)?

      對(duì)一個(gè)已經(jīng)釋放的對(duì)象執(zhí)行了release

      執(zhí)行了死循環(huán)

16.蘋果是如何實(shí)現(xiàn)autoreleasepool的?

autoreleasepool以一個(gè)隊(duì)列數(shù)組的形式實(shí)現(xiàn),主要通過下列三個(gè)函數(shù)完成.

      objc_autoreleasepoolPush

      objc_autoreleasepoolPop

      objc_aurorelease

看函數(shù)名就可以知道,對(duì)autorelease分別執(zhí)行push,和pop操作。銷毀對(duì)象時(shí)執(zhí)行release操作。

17.如何用GCD同步若干個(gè)異步調(diào)用?(如根據(jù)若干個(gè)url異步加載多張圖片,然后在都下載完成后合成一張整圖)

使用Dispatch Group追加block到Global Group Queue,這些block如果全部執(zhí)行完畢,就會(huì)執(zhí)行Main Dispatch Queue中的結(jié)束處理的block。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{ /*加載圖片1 */ });

dispatch_group_async(group, queue, ^{ /*加載圖片2 */ });

dispatch_group_async(group, queue, ^{ /*加載圖片3 */ });

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    // 合并圖片

});

18.dispatch_barrier_async的作用是什么?

dispatch_barrier_async函數(shù)會(huì)等待追加到Concurrent Dispatch Queue并行隊(duì)列中的操作全部執(zhí)行完之后,然后再執(zhí)行dispatch_barrier_async函數(shù)追加的處理,等dispatch_barrier_async追加的處理執(zhí)行結(jié)束之后,Concurrent Dispatch Queue才恢復(fù)之前的動(dòng)作繼續(xù)執(zhí)行。

打個(gè)比方:比如你在看電視每個(gè)臺(tái)都在播放精彩的內(nèi)容,突然插進(jìn)來一則廣告。于是你就換臺(tái),結(jié)果發(fā)現(xiàn)每個(gè)臺(tái)都在放這個(gè)廣告,等這個(gè)廣告播放完之后,各個(gè)臺(tái)才開始恢復(fù)原來播放的內(nèi)容。dispatch_barrier_async函數(shù)追加的內(nèi)容就如這條廣告。

19.KVC的keyPath中的集合運(yùn)算符如何使用?

      必須用在集合對(duì)象上或普通對(duì)象的集合屬性上

      簡單集合運(yùn)算符有@avg, @count , @max , @min ,@sum,

      格式 @”@sum.age”或 @”集合屬性.@max.age”

20.如何調(diào)試BAD_ACCESS錯(cuò)誤

      重寫object的respondsToSelector方法,現(xiàn)實(shí)出現(xiàn)EXEC_BAD_ACCESS前訪問的最后一個(gè)object

      通過NSZombieEnabled

      設(shè)置全局?jǐn)帱c(diǎn)快速定位問題代碼所在行

21.__block 和 __weak 之間的區(qū)別.

? 前者用于指明當(dāng)前聲明的變量在被 block 捕獲之后, 可以在 block 中改變變量的值. 因?yàn)樵?block 聲明的同時(shí)會(huì)截獲該 block 所使用的全部自動(dòng)變量的值, 而這些值只在 block 中只具有"使用權(quán)"而不具有"修改權(quán)". 而 __block 說明符就為 block 提供了變量的修改權(quán).

? 后者是所有權(quán)修飾符, 什么是所有權(quán)修飾符? 這里涉及到另一個(gè)問題, 因?yàn)樵?ARC 有效時(shí), id 類型和對(duì)象類型同 C 語言中的其他類型不同, 必須附加所有權(quán)修飾符. 所有權(quán)修飾符一種有 4 種:

       ?   __strong

       ?   __weak

       ?   __unsafe_unretained

       ?   __autorelease

· __weak 與 weak 的區(qū)別只在于, 前者用于變量的聲明, 而后者用于屬性的聲明.

22.什么是method swizzling?

在Objective-C中調(diào)用一個(gè)方法,其實(shí)是向一個(gè)對(duì)象發(fā)送消息,查找消息的唯一依據(jù)是selector的名字。利用Objective-C的動(dòng)態(tài)特性,可以實(shí)現(xiàn)在運(yùn)行時(shí)偷換selector對(duì)應(yīng)的方法實(shí)現(xiàn),達(dá)到給方法掛鉤的目的。

每個(gè)類都有一個(gè)方法列表,存放著selector的名字和方法實(shí)現(xiàn)的映射關(guān)系。IMP有點(diǎn)類似函數(shù)指針,指向具體的Method實(shí)現(xiàn)。

23.為什么其他語言里叫函數(shù)調(diào)用,Object-C里則叫給我對(duì)象發(fā)消息(或者談下對(duì)runtime的理解)

在java中,類和方法在編譯期就綁定在一起

在OC中,方法調(diào)用是向類發(fā)送消息,如(bady cry)在運(yùn)行時(shí)會(huì)轉(zhuǎn)換成objc_msgSend(bady,cry),向?qū)ο蟀l(fā)送消息時(shí)根據(jù)isa指針找到類,在根據(jù)類的調(diào)度表查找方法,沒找到方法則在父類中查找直至基類,如果始終沒有找到返回nil

Objective-C 的 Runtime 鑄就了它動(dòng)態(tài)語言的特性,這些深層次的知識(shí)雖然平時(shí)寫代碼用的少一些,但是卻是每個(gè) Objc 程序員需要了解的。Objc Runtime使得C具有了面向?qū)ο竽芰?,在程序運(yùn)行時(shí)創(chuàng)建,檢查,修改類、對(duì)象和它們的方法??梢允褂胷untime的一系列方法實(shí)現(xiàn)。

24.TCP和UDP有什么區(qū)別?

TCP是面向連接的,建立連接需要經(jīng)歷三次握手,保證數(shù)據(jù)正確性和數(shù)據(jù)順序

UDP是非連接的協(xié)議,傳送數(shù)據(jù)受生成速度,傳輸帶寬等限制,可能造成丟包

UDP一臺(tái)服務(wù)端可以同時(shí)向多個(gè)客戶端傳輸信息

TCP報(bào)頭體積更大,對(duì)系統(tǒng)資源要求更多

25.+(void)load; +(void)initialize;有什么用處?

當(dāng)類對(duì)象被引入項(xiàng)目時(shí), runtime 會(huì)向每一個(gè)類對(duì)象發(fā)送 load 消息. load 方法還是非常的神奇的, 因?yàn)樗鼤?huì)在每一個(gè)類甚至分類被引入時(shí)僅調(diào)用一次, 調(diào)用的順序是父類優(yōu)先于子類, 子類優(yōu)先于分類. 而且 load 方法不會(huì)被類自動(dòng)繼承, 每一個(gè)類中的 load 方法都不需要像 viewDidLoad 方法一樣調(diào)用父類的方法. 由于 load 方法會(huì)在類被 import 時(shí)調(diào)用一次, 而這時(shí)往往是改變類的行為的最佳時(shí)機(jī). 我在 DKNightVersion 中使用 method swizlling 來修改原有的方法時(shí), 就是在分類 load 中實(shí)現(xiàn)的.

initialize 方法和 load 方法有一些不同, 它雖然也會(huì)在整個(gè) runtime 過程中調(diào)用一次, 但是它是在該類的第一個(gè)方法執(zhí)行之前調(diào)用, 也就是說 initialize 的調(diào)用是惰性的, 它的實(shí)現(xiàn)也與我們?cè)谄綍r(shí)使用的惰性初始化屬性時(shí)基本相同. 我在實(shí)際的項(xiàng)目中并沒有遇到過必須使用這個(gè)方法的情況, 在該方法中主要做靜態(tài)變量的設(shè)置并用于確保在實(shí)例初始化前某些條件必須滿足.

在Objective-C中,runtime會(huì)自動(dòng)調(diào)用每個(gè)類的兩個(gè)方法。+load會(huì)在類初始加載時(shí)調(diào)用,+initialize會(huì)在第一次調(diào)用類的類方法或?qū)嵗椒ㄖ氨徽{(diào)用。這兩個(gè)方法是可選的,且只有在實(shí)現(xiàn)了它們時(shí)才會(huì)被調(diào)用。

共同點(diǎn):兩個(gè)方法都只會(huì)被調(diào)用一次。

26.使用drawRect有什么影響?(這個(gè)可深可淺,你至少得用過。。)

drawRect方法依賴Core Graphics框架來進(jìn)行自定義的繪制,但這種方法主要的缺點(diǎn)就是它處理touch事件的方式:每次按鈕被點(diǎn)擊后,都會(huì)用setNeddsDisplay進(jìn)行強(qiáng)制重繪;而且不止一次,每次單點(diǎn)事件觸發(fā)兩次執(zhí)行。這樣的話從性能的角度來說,對(duì)CPU和內(nèi)存來說都是欠佳的。特別是如果在我們的界面上有多個(gè)這樣的UIButton實(shí)例。

這個(gè)方法的主要作用是根據(jù)傳入的 rect 來繪制圖像 參見文檔. 這個(gè)方法的默認(rèn)實(shí)現(xiàn)沒有做任何事情, 我們可以在這個(gè)方法中使用 Core Graphics 和 UIKit 來繪制視圖的內(nèi)容.

這個(gè)方法的調(diào)用機(jī)制也是非常特別. 當(dāng)你調(diào)用 setNeedsDisplay 方法時(shí), UIKit 將會(huì)把當(dāng)前圖層標(biāo)記為 dirty, 但還是會(huì)顯示原來的內(nèi)容, 直到下一次的視圖渲染周期, 才會(huì)為標(biāo)記為 dirty 的圖層重新建立 Core Graphics 上下文, 然后將內(nèi)存中的數(shù)據(jù)恢復(fù)出來, 再使用 CGContextRef 進(jìn)行繪制.

27.sip是什么?

1> SIP(Session Initiation Protocol),會(huì)話發(fā)起協(xié)議

2> SIP是建立VOIP連接的 IETF 標(biāo)準(zhǔn),IETF是全球互聯(lián)網(wǎng)最具權(quán)威的技術(shù)標(biāo)準(zhǔn)化組織

3> 所謂VOIP,就是網(wǎng)絡(luò)電話,直接用互聯(lián)網(wǎng)打電話,不用耗手機(jī)話費(fèi)

28.AFN 與 ASI 有什么區(qū)別

1> AFN基于NSURL,ASI基于底層的CFNetwork框架,因此ASI的性能優(yōu)于AFN

2> AFN采取block的方式處理請(qǐng)求,ASI最初采取delegate的方式處理請(qǐng)求,后面也增加了block的方式

3> AFN只封裝了一些常用功能,滿足基本需求,直接忽略了很多擴(kuò)展功能,比如沒有封裝同步請(qǐng)求;ASI提供的功能較多,預(yù)留了各種接口和工具供開發(fā)者自行擴(kuò)展

4> AFN直接解析服務(wù)器返回的JSON、XML等數(shù)據(jù),而ASI比較原始,返回的是NSData二進(jìn)制數(shù)據(jù)

29.在異步線程中下載很多圖片,如果失敗了,該如何處理?請(qǐng)結(jié)合RunLoop來談?wù)劷鉀Q方案.(提示:在異步線程中啟動(dòng)一個(gè)RunLoop重新發(fā)送網(wǎng)絡(luò)請(qǐng)求,下載圖片)

1> 重新下載圖片

2> 下載完畢, 利用RunLoop的輸入源回到主線程刷新UIImageVIUew

30.如果后期需要增加數(shù)據(jù)庫中的字段怎么實(shí)現(xiàn),如果不使用CoreData呢?

編寫SQL語句來操作原來表中的字段

1> 增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名 字段類型;

2> 刪除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

3> 修改表字段

ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名;

31.簡單描述下客戶端的緩存機(jī)制?

1. 緩存可以分為:內(nèi)存數(shù)據(jù)緩存、數(shù)據(jù)庫緩存、文件緩存

2. 每次想獲取數(shù)據(jù)的時(shí)候

1> 先檢測(cè)內(nèi)存中有無緩存

2> 再檢測(cè)本地有無緩存(數(shù)據(jù)庫\文件)

3> 最終發(fā)送網(wǎng)絡(luò)請(qǐng)求

4> 將服務(wù)器返回的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行緩存(內(nèi)存、數(shù)據(jù)庫、文件), 以便下次讀取

32.利用Socket建立網(wǎng)絡(luò)連接的步驟

建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 。

套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)。

1。服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請(qǐng)求。

2??蛻舳苏?qǐng)求:指客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。

3。連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求

引用自 :https://www.cnblogs.com/Twisted-Fate/p/4985769.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    大羅Rnthking閱讀 1,057評(píng)論 0 2
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,132評(píng)論 0 12
  • 推薦閱讀:iOS開發(fā)——2019 最新 BAT面試題合集(持續(xù)更新中) 史上最全的iOS面試題及答案 iOS面試小...
    iOS開發(fā)之家閱讀 1,728評(píng)論 1 15
  • 1.為什么說Objective-C是一門動(dòng)態(tài)的語言? 一、動(dòng)態(tài)語言,是指在程序運(yùn)行時(shí)能夠改變其結(jié)構(gòu),新的函數(shù)可以被...
    年輕就要活出樣閱讀 528評(píng)論 0 1
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,580評(píng)論 0 35

友情鏈接更多精彩內(nèi)容