中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

iOS的那些面試

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

筆試面試是程序員應(yīng)聘繞不過的坎,想進(jìn)大廠就一定要有知識儲備量,而這個卻是最佳的考察方式。筆者分享一些收集的iOS面試題,答案僅供參考,如有錯誤,還請指正。

第一部分

1.Objective-C語言的基本特點(diǎn)?

Objective-C語言是C語言的一個超集,只是在C的基礎(chǔ)之上添加了面向?qū)ο螅∣O)的特性;Objective-C與Java語言相同都是單繼承,這一點(diǎn)與C++語言不同(多重繼承),這一點(diǎn)可以參看之前有關(guān)講解繼承的文章;Objective-C不支持命名空間,取而代之的是在類名之前添加前綴,以此來區(qū)分。

2.#include與#import的區(qū)別,#import與@class的區(qū)別?

1)#include和#import效果相同,只是后者不會引起交叉編譯,確保頭文件只會被導(dǎo)入一次。

2)#import會包含這個類的所有信息,包括實(shí)體變量和方法,而@class只是告訴編譯器,其后面聲明的名稱是類的名稱,至于這些類是如何定義的,暫時不用考慮,后面會再告訴你。使用#import編譯效率高,防止相互包含的編譯錯誤。

3.簡述類目優(yōu)缺點(diǎn),如果覆蓋本類或者父類的方法會出現(xiàn)什么問題?

優(yōu)點(diǎn):不需要通過增加子類而增加現(xiàn)有類的行為(方法),且類目中的方法與原始類方法基本沒有區(qū)別。

缺點(diǎn):無法向類目添加實(shí)例變量。覆蓋原始類方法后,原始類的方法沒辦法調(diào)用。

4.簡述內(nèi)存管理基本原則?

如果使用alloc、copy(mutableCopy)或者retain一個對象時,你就有義務(wù)向它發(fā)送一條release或autorelease消息。其他方法創(chuàng)建的對象,不需要由你來管理內(nèi)存。

5.什么是ARC技術(shù)?與GC是否相同?

ARC是Automatic Reference Counting的簡稱,我們稱之為自動引用計(jì)數(shù),是iOS5.0之后推出的內(nèi)存管理的新特性。本質(zhì)上還是使用引用計(jì)數(shù)來管理對象,只是我們在編寫代碼時,不需要向?qū)ο蟀l(fā)送release或autorelease方法,也不可以調(diào)用dealloc方法,編譯器會在合適的位置自動給用戶生成release(autorelease)消息。GC是Garbage Collection,內(nèi)存垃圾回收機(jī)制,ARC比GC性能好。

6.iOS中是否支持垃圾回收機(jī)制?

iOS開發(fā)只支持MRC與ARC,Mac開發(fā)支持GC垃圾回收機(jī)制,10.8之后棄用了GC,推薦使用ARC。

7.深、淺復(fù)制的基本概念以及區(qū)別?

淺復(fù)制:只復(fù)制對象本身,不對里面的屬性復(fù)制。

深復(fù)制:不僅復(fù)制對象本身,對象持有的屬性對象也做復(fù)制。

8.內(nèi)存中的堆區(qū)和棧區(qū)的差別?

棧區(qū)(stack)由編譯器自動分配釋放,存放方法(函數(shù))的參數(shù)值,局部變量的值等。

堆區(qū)(heap)一般由程序員分配與釋放,若程序員不釋放,則會內(nèi)存溢出。

9.用戶自定義了一個對象,如何實(shí)現(xiàn)拷貝(可變和不可變拷貝)?

必須實(shí)現(xiàn)copying和mutableCopying協(xié)議,表示返回一個不可變和可變的對象。否則,程序?qū)霈F(xiàn)異常。

-(id)copyWithZone:(NSZone *)zone {
	Person *person = [[self Class] allocWithZone:zone];
	person->age = self.age;
	person->name = self.name;
	return person;
}
-(id)mutableCopyWithZone:(NSZone *)zone;

10.定義屬性時,什么時候用assign、retain、copy和nonatomic?

assign:普通賦值,一般常用于基本數(shù)據(jù)類型,常見委托設(shè)計(jì)模式,以此來防止循環(huán)引用。

retain:保留計(jì)數(shù),獲得了對象的所有權(quán)。引用計(jì)數(shù)在原有基礎(chǔ)上加1。

copy:用來復(fù)制對象,一般字符串使用,F(xiàn)oundation中的不可變對象使用,效果相當(dāng)于retain,只是引用計(jì)數(shù)加1。

nonatomic:非原子性訪問,不加同步,多線程并發(fā)訪問會提高性能。

11.strong和weak,_unsafe_unretained與weak的區(qū)別?

strong:強(qiáng)引用,在ARC中告訴編譯器幫助我們自動插入retain。

weak:弱引用,是普通賦值,相當(dāng)于手動管理內(nèi)存的assign。

_unsafe_unretained:與weak功能一致,區(qū)別在于當(dāng)指向的對象銷毀后,weak會將變量置為nil,防止調(diào)用野指針。

12.ARC存在內(nèi)存泄露嗎?

ARC中如果內(nèi)存管理不當(dāng)?shù)脑,同樣會存在?nèi)存泄露。例如,ARC中也會循環(huán)引用導(dǎo)致內(nèi)存泄露;Objective-C對象與CoreFoundation類之間橋接時,管理不當(dāng)也會產(chǎn)生內(nèi)存泄露。

13.當(dāng)我們釋放對象時,為什么需要調(diào)用[super dealloc]方法?

子類是繼承自父類,那么子類中有一些實(shí)例變量(對象),是繼承自父類的,因此,我們需要調(diào)用父類方法,將父類所擁有的實(shí)例進(jìn)行釋放。

14.自動釋放池是什么,如何工作?

自動釋放池是NSAutorelease類的一個實(shí)例,當(dāng)向一個對象發(fā)送autorelease消息時,該對象會自動入池,待池銷毀時,將會向池中所有對象發(fā)送一條release消息,釋放對象。

15.為什么delegate(代理)屬性都是assign而不是retain的?

防止循環(huán)引用,以至對象無法得到正確的釋放。

第二部分

1.iOS開發(fā)中數(shù)據(jù)持久性有哪幾種?

plist文件寫入,對象歸檔,sqlite3數(shù)據(jù)庫,CoreData。

2.什么是KVC和KVO?它們之間的關(guān)系是什么?

KVC:鍵值編碼,是一種間接訪問對象實(shí)例變量的機(jī)制,該機(jī)制可以不通過存取方法就可以訪問對象的實(shí)例變量。

KVO:鍵值觀察,是一種能使得對象獲取到其他對象屬性變化的通知機(jī)制。

實(shí)現(xiàn)KVO鍵值觀察模式,被觀察的對象必須使用KVC鍵值編碼來修改它的實(shí)例變量,這樣才能被觀察者觀察到。因此,KVC是KVO的基礎(chǔ)或者說KVO的實(shí)現(xiàn)是建立在KVC的基礎(chǔ)之上的。

3.簡述常見的設(shè)計(jì)模式?

單例模式、代理設(shè)計(jì)、觀察者(通知)、工廠方法、模板方法。

4.內(nèi)存管理在dealloc方法中用release方法與self.xx=nil哪個好?

使用self.xx=nil更好,因?yàn)橄日{(diào)用了release方法,而且還將變量設(shè)置為nil,這樣就更安全的釋放對象,防止野指針調(diào)用。

5.線程與進(jìn)程的區(qū)別和聯(lián)系?

一般的應(yīng)用程序是單個進(jìn)程,也有多進(jìn)程(Chrome),進(jìn)程是個靜態(tài)的容器,里面容納了很多個線程,線程是一系列方法的線性執(zhí)行路徑。

6.Objective-C語言的優(yōu)缺點(diǎn)?

優(yōu)點(diǎn):類目、動態(tài)識別、支持C語言、Objective-C與C++可以混編。

缺點(diǎn):不支持命名空間、不支持運(yùn)算符重載、不支持多重繼承。

7.代理delegate、通知Notification與block的使用區(qū)別?

delegate和block一般是用于兩個對象一對一之間的通信交互,delegate需要定義協(xié)議方法,代理對象實(shí)現(xiàn)協(xié)議方法,并且需要建立代理關(guān)系才可以實(shí)現(xiàn)通信。block更加簡潔,不需要定義繁瑣的協(xié)議方法,但是如果通信事件比較多的話,建議使用delegate。

Notification主要用于一對多情況下通信,而且,通信對象之間不需要建立關(guān)系,但是使用通知,代碼可讀性差。

8.控制器ViewController的loadView、viewDidLoad、viewWillApear和viewDidUnload分別是在什么時候調(diào)用?

loadView:當(dāng)控制器的根視圖view為空,且此view被訪問時調(diào)用。

viewDidLoad:loadView調(diào)用之后被調(diào)用。

viewWillApear:當(dāng)控制器根視圖view被添加到父視圖上時調(diào)用。

viewDidUnload:iOS6.0之前,當(dāng)內(nèi)存警告時,先卸載視圖,再調(diào)用

viewDidUnload來釋放內(nèi)存。

[email protected]和@dynamic的區(qū)別?

@synthesize:系統(tǒng)自動生成getter和setter屬性聲明。

@dynamic:告訴編譯器,屬性的獲取與賦值方法由用戶自己實(shí)現(xiàn),不自動生成。

10.事件響應(yīng)者鏈的概念?

響應(yīng)者鏈表示一系列的響應(yīng)者對象。事件被交由第一響應(yīng)者對象處理,如果第一響應(yīng)者不處理,事件被沿著響應(yīng)者鏈向上傳遞,交給下一個響應(yīng)者。一般來說,第一響應(yīng)者是個視圖對象或者其子類對象,當(dāng)其被觸摸后事件交由它處理,如果它不處理,事件會被傳遞給它的視圖控制器對象(如果存在),然后是它的父視圖對象(如果存在),以此類推,直到頂層視圖。接下來會沿著頂層視圖到窗口(UIWindow對象),再到程序(UIApplication對象)。如果整個過程都沒有響應(yīng)這個事件,該事件被丟棄。一般情況下,在響應(yīng)者鏈中只要有對象處理事件,事件就停止傳遞。但有時候可以在視圖的響應(yīng)方法中根據(jù)一些條件判斷來決定是否需要繼續(xù)傳遞事件。

11.C語言中的static變量和static函數(shù)有什么作用?

1)表示變量是靜態(tài)存儲變量,表示變量存放在靜態(tài)存儲區(qū)。

2)加在函數(shù)前面的時候表示該函數(shù)是內(nèi)部連接,只在本文件中有效,別的文件中不能使用該函數(shù)。

12.指針題

1)int a; //一個數(shù)值。
2)int *a; //一個指向數(shù)值的指針。
3)int **a; //一個指向指針的指針。
4)int a[10]; //一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。
5)int *a[10]; //一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。
6)int (*a)[10]; //一個指向有10個整型數(shù)數(shù)組的指針。
7)int (*a)(int); //一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)。
8)int (*a[10])(int); //一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)。

13.寫一個NSString類的實(shí)現(xiàn)?

+(id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding {
	NSString *obj;
	obj = [self allocWithZone:NSDefaultMallocZone()];
	obj = [obj initWithCString:nullTerminatedCString encoding:encoding];
	return autorelease(obj);
}

14.Objective-C與C如何混用?Objective-C與C++如何混用?

實(shí)現(xiàn)文件的擴(kuò)展名.m改成.mm即可,但cpp文件必須只能使用C/C++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)Objective-C的代碼,因?yàn)閏pp只能寫C++的代碼。

15.Objective-C中有私有方法和私有變量嗎?

使用private修飾的全局變量是私有的變量。

Objective-C在語法上沒有設(shè)計(jì)私有的方法,不過可以通過延展在實(shí)現(xiàn)文件里定義方法作為私有的方法。但不是真正意義上的私有方法,也是可以調(diào)用的,只是外部不可見而已。

第三部分

1.下面關(guān)鍵字const有什么含義?

const int a;
int const a;
const int *a;
int * const a;

前兩個的作用是一樣的,a是一個常整型數(shù)。

第三個意味著a是一個指向常整型數(shù)的指針(即整型數(shù)是不可修改的,但指針可以)。

第四個意味著a是一個指向整型數(shù)的常指針(即指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。

2.C語言中extern的作用,extern “C”的作用?

1)extern可以置于變量或者函數(shù)前,以標(biāo)示變量或函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。

2)C++語言在編譯的時候?yàn)榱私鉀Q函數(shù)的多態(tài)問題,會將函數(shù)名和參數(shù)聯(lián)合起來生成一個中間的函數(shù)名稱,而C語言則不會,因此會造成鏈接時找不到對應(yīng)函數(shù)的情況,此時C函數(shù)就需要用extern “C”進(jìn)行鏈接指定,這告訴編譯器,請保持我的名稱,不要給我生成用于鏈接的中間函數(shù)名。

3.Objective-C是如何管理內(nèi)存的?

Objective-C語言是使用引用計(jì)數(shù)來管理一個對象的生命周期,當(dāng)對象被其他“人”使用的時候引用計(jì)數(shù)加1,不使用時減1,當(dāng)此對象的引用計(jì)數(shù)為0時,則對象被系統(tǒng)回收。

4.什么是動態(tài)綁定(多態(tài))?

動態(tài)綁定是面向?qū)ο筇匦灾欢鄳B(tài)的體現(xiàn),聲明一個變量,在運(yùn)行的時候可以綁定不同的對象,比如在方法的參數(shù)中聲明這樣一個變量UIView *view,運(yùn)行的時候,我們可以根據(jù)不同的應(yīng)用場景給view變量傳入不同的對象,可以傳遞一個UIButton對象,也可以傳入UIImageView對象。

5.如何理解delegate?

delegate,又稱為委托或代理,它是一種設(shè)計(jì)模式。delegate主要用于兩個對象之間的通信交互,并且解除兩個通信對象的耦合性,iOS中大量使用了delegate設(shè)計(jì),主要用于視圖與使用對象之間的通信交互。

6.block與函數(shù)有何異同?block有何優(yōu)點(diǎn)?

1)block類似于C里面的函數(shù)指針,都可以作為參數(shù)進(jìn)行傳遞,用于回調(diào)。但是block的實(shí)現(xiàn)可以定義在方法中,函數(shù)則不可以。

2)block語法簡潔,可以在方法中定義實(shí)現(xiàn),這樣可以訪問方法中的局部變量,使代碼更加的緊湊,結(jié)構(gòu)化。

7.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?

#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /*__INCvxWorksh*/

顯然,頭文件中的編譯宏“#ifndef INCvxWorksh、#define INCvxWorksh、#endif”的作用是防止該頭文件被重復(fù)引用。

8.CocoaTouch框架?

UIKit、Foundation、CoreGraphic、CoreAnimation

1)音頻和視頻:Core Audio、OpenAL、Media Library、AV Foundation

2)數(shù)據(jù)管理:Core Data、SQLite

3)圖形和動畫:Core Animation、OpenGL ES、Quartz 2D、Core Graphic

4)用戶應(yīng)用:Address Book、Core Location、Map Kit、Store Kit

9.棧結(jié)構(gòu)與隊(duì)列的區(qū)別?

棧(stack):限定只能在表的一端進(jìn)行插入和刪除操作的線性表。

隊(duì)列(queue):限定只能在表的一端插入和在另一端進(jìn)行刪除操作的線性表。

1)隊(duì)列先進(jìn)先出,棧先進(jìn)后出。

2)對插入和刪除操作的“限定”不同。

3)遍歷數(shù)據(jù)速度不同。隊(duì)列遍歷數(shù)據(jù)的速度要快得多。

10.Objective-C中有無多重繼承?如何實(shí)現(xiàn)多重繼承?

Objective-C是沒有多重繼承的。

Cocoa中所有的類都是NSObject的子類,多繼承在這里是用protocol委托代理來實(shí)現(xiàn)的。

面向?qū)ο笳Z言大部分都是單繼承,例如:Java、C#。

C++支持多繼承。

11.static全局變量與普通的全局變量的區(qū)別?局部變量呢?函數(shù)呢?

1)static全局變量與普通全局變量的區(qū)別:static全局變量只初始化一次,防止在其他文件單元中被引用。

2)static局部變量與普通局部變量的區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值。

3)static函數(shù)與普通函數(shù)的區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝。

12.什么是類目與延展?

類目:為已知的類增加新的方法。

延展:通知在本類的定義里使用類目來聲明私有方法。

13.Objective-C中的協(xié)議和Java中的接口區(qū)別?

協(xié)議定義的方法,可以設(shè)置可選實(shí)現(xiàn)和必須實(shí)現(xiàn)。

接口則是必須全部實(shí)現(xiàn)。

14.在一個對象的方法里self.name=”object”和name=”object”有什么不同?

前者調(diào)用的是設(shè)置器方法,后者是普通賦值。

15.單例設(shè)計(jì)模式的實(shí)現(xiàn)?為什么使用單例設(shè)計(jì)?

static File *instance = nil;
@implementation File
//獲取單例的方法
+(id)shareInstance {
	@synthesize (self) {
		if(instance == nil) {
			instance = [[File alloc] init];
		}
	}
	return instance;
}
//覆寫allocWithZone、copyWithZone、retain、release和autorelease方法,目的是限制這個類只創(chuàng)建一個對象

為什么使用單例設(shè)計(jì)?

1)單例設(shè)計(jì)是用來限制一個類只能創(chuàng)建一個對象,那么此對象中的屬性可以存儲全局共享的數(shù)據(jù),所有的類都可以訪問、設(shè)置此單例對象中的屬性數(shù)據(jù)。

2)如果一個類創(chuàng)建的時候非常的耗費(fèi)性能,那么此類如果能滿足要求,可以設(shè)置為單例節(jié)約性能。

第四部分

1.層CALayer和UIView的區(qū)別是什么?

兩者最大的區(qū)別是,圖層不會直接渲染到屏幕上。UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它,它本身是由CoreAnimation來實(shí)現(xiàn)的,它真正繪圖的部分是由一個CALayer類來管理的。UIView本身更像是一個CALayer的管理器。一個UIView上可以有多個CALayer,每個CALayer顯示一種東西,增強(qiáng)UIView的展現(xiàn)能力。

2.什么是GCD?

GCD是Apple開發(fā)的一個多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,并引入到iOS4.0。GCD是一個替代諸如NSThread等技術(shù)的很高效和強(qiáng)大的技術(shù)。GCD完全可以處理諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問題。

3.TCP/UDP的區(qū)別和聯(lián)系?

1)TCP的全稱為傳輸控制協(xié)議,這種協(xié)議可以提供面向連接的、可靠的、點(diǎn)到點(diǎn)的通信。

2)UDP的全稱為用戶數(shù)據(jù)報協(xié)議,它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信。

3)用TCP還是UDP,需要看程序注重哪一個方面,需要可靠還是快速。

4.Socket連接和Http連接的區(qū)別?

Http連接:Http連接就是所謂的短鏈接,即客戶端向服務(wù)器發(fā)送一次請求,服務(wù)器響應(yīng)后連接即會斷掉。

Socket連接:Socket連接就是所謂的長連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會主動斷掉。

5.什么是TCP連接的三次握手?

第一次握手:客戶端發(fā)送SYN包(SYN=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)。

第二次握手:服務(wù)器收到SYN包,必須確認(rèn)客戶的SYN(ACK=j+1),同時自己也發(fā)送一個SYN包(SYN=k),即SYN+ACK包,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài)。

第三次握手:客戶端接收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ACK=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。

6.frame和bounds的區(qū)別?

frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置大。▍⒄拯c(diǎn)是父視圖的坐標(biāo)系統(tǒng))。

bounds指的是:該view在本身坐標(biāo)系統(tǒng)中的位置和大。▍⒄拯c(diǎn)是本身的坐標(biāo)系統(tǒng))。

7.如何理解MVC設(shè)計(jì)模式?

MVC是一種架構(gòu)設(shè)計(jì),M表示數(shù)據(jù)模型,V表示視圖,C表示控制器。

數(shù)據(jù)模型:負(fù)責(zé)存儲、定義、操作數(shù)據(jù)。

視圖:用來展示數(shù)據(jù)給用戶,和用戶進(jìn)行操作交互。

控制器:它是M與V的協(xié)調(diào)者,控制器獲取數(shù)據(jù),將數(shù)據(jù)交給視圖去展示。

8.控制器的xib是怎么加載的?

當(dāng)UIViewController的loadView被調(diào)用時,在此方法中,通過NSBundle加載xib,先通過控制器的類名作為xib的文件名加載此xib文件。如果找到此xib文件,則加載為view對象作為控制器的根視圖,如果沒有xib文件,則通過alloc創(chuàng)建一個view對象作為根視圖。

9.控制器如何處理系統(tǒng)內(nèi)存不足警告?

內(nèi)存不足時,系統(tǒng)會調(diào)用控制器didReceiveMemoryWaring方法通知控制器內(nèi)存不足。iOS6.0與6.0之前的處理方式不一樣。

1)iOS6.0之前:調(diào)用didReceiveMemoryWaring后,將self.view設(shè)置為nil,并且再調(diào)用viewDidUnload方法,在此方法中我們應(yīng)該釋放子視圖。

2)iOS6.0之后:調(diào)用didReceiveMemoryWaring后,不再調(diào)用viewDidUnload方法,則應(yīng)該在didReceiveMemoryWaring方法中手動將self.view=nil,并且釋放子視圖。

10.iOS中對象間有哪些通信方式?

代理delegate、block、通知和KVO。

11.block在內(nèi)存管理上的特點(diǎn)?需要注意循環(huán)引用,如何解決循環(huán)引用?

1)block中使用了局部對象,則會將此對象retain,引用了當(dāng)前對象的屬性或者方法,則會將當(dāng)前對象retain。

2)解決循環(huán)引用:將當(dāng)前對象賦值給一個局部變量,并且使用__block關(guān)鍵字修飾該局部變量,使用該變量訪問當(dāng)前對象的屬性和方法。

12.Objective-C中有線程池(線程隊(duì)列)嗎?NSOperationQueue是如何管理線程的?

NSOperationQueue是Objective-C的線程池,線程池中可以存放多個線程。

NSOperationQueue可以管理線程的并發(fā)數(shù),還可以管理線程間的優(yōu)先級。

13.timer的間隔周期準(zhǔn)嗎?為什么?怎樣實(shí)現(xiàn)一個精準(zhǔn)的timer?

定時器timer一般都是準(zhǔn)確的,但是當(dāng)主線程有些時候難免會出現(xiàn)堵塞情況,這樣就有可能導(dǎo)致定時器timer會延遲從而不準(zhǔn)確。我們可以開發(fā)一個多線程,在此多線程上運(yùn)行定時器,這樣多線程只運(yùn)行定時器,不會因堵塞而導(dǎo)致誤差。

14.Http協(xié)議的特點(diǎn)?GET與POST的區(qū)別?什么是Https協(xié)議?

1)Http協(xié)議是短鏈接,都是客戶端主動發(fā)送請求,服務(wù)器做出響應(yīng),服務(wù)器響應(yīng)之后,連接則斷開。

2)GET請求沒有請求體,POST含有請求體,請求參數(shù)可以放入請求體中,所以,POST可以提交大量的數(shù)據(jù)給服務(wù)器,更加安全。

3)HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議,它是一個安全通信通道,它基于HTTP開發(fā),用于在客戶計(jì)算機(jī)和服務(wù)器之間交換信息。它使用安全套接字層(SSL)進(jìn)行信息交換,簡單來說它是HTTP的安全版。

15.XML數(shù)據(jù)的解析方式各有什么不同?JSON解析有哪些框架?

XML數(shù)據(jù)解析有兩種方式:DOM解析和SAX解析。

DOM解析:必須完成DOM樹的構(gòu)造,在處理規(guī)模較大的XML文檔時就很耗費(fèi)內(nèi)存,占用資源較多。

SAX解析:與DOM不同的是,SAX是用事件驅(qū)動模型,解析XML文檔時每遇到一個開始或者結(jié)束標(biāo)簽、屬性或一條指令時,程序就產(chǎn)生一個事件來進(jìn)行相應(yīng)的處理。因此,SAX相對于DOM來說更適合操作大的XML文檔。

JSON解析:現(xiàn)在性能比較好的主要是第三方的JSONKit和iOS自帶的JSON解析類,自帶的JSON解析性能是最高的,但是只能是iOS5之后才可以使用。

第五部分

1.tableView是如何復(fù)用的?

如果屏幕上能顯示10個單元格,則tableView只會創(chuàng)建11個單元格,也就是n+1,當(dāng)滑到第12個單元格時就會復(fù)用第1個單元格對象。tableView中有個單元格池的概念,tableView調(diào)用協(xié)議方法獲取單元格時,先從池子中查找是否有可復(fù)用的單元格,如果有則復(fù)用,如果沒有則創(chuàng)建一個單元格對象。

2.如何優(yōu)化tableView的滑動速度?

1)復(fù)用單元格。

2)使用不透明的視圖,單元格中盡量少使用動畫。

3)圖片加載使用異步加載,并且設(shè)置圖片加載的并發(fā)數(shù)。

4)滑動時不加載圖片,停止滑動開始加載。

5)文字、圖片可直接drawInRect繪制。

6)如非必要,減少reloadData全部cell,只reloadRowsAtIndexPaths。

7)如果cell是動態(tài)行高度,計(jì)算出高度后緩存。

8)cell高度固定的話直接用cell.rowHeight設(shè)置高度。

3.談?wù)剬unloop的理解?

Run loops是線程相關(guān)的基礎(chǔ)框架的一部分。一個run loop就是一個事件處理的循環(huán),用來不停的調(diào)度工作以及處理輸入事件。使用run loop的目的是讓你的線程在有工作的時候忙于工作,而沒有工作的時候處于休眠狀態(tài)。

4.如何調(diào)用drawRect方法與layoutSubView方法?這兩個方法的作用?

通過setNeedsLayout方法異步調(diào)用layoutSubView方法。

通過setNeedsDisplay方法異步調(diào)用drawRect方法。

drawRect方法用于繪圖,layoutSubView方法用于布局子視圖。

5.UIView與UIViewController的關(guān)系?

每個控制器都有一個根視圖,控制器UIViewController用來管理此視圖的加載和顯示。

6.iOS中有哪些手勢?

輕擊、捏合、平移、輕掃、旋轉(zhuǎn)和長按。

7.Http和Socket的區(qū)別?

Http是客戶端用Http協(xié)議進(jìn)行請求,發(fā)送請求時需要封裝http請求頭,并綁定請求的數(shù)據(jù),服務(wù)器一般有Web服務(wù)器配合(當(dāng)然也非絕對)。Http請求方式為客戶端主動發(fā)起請求,服務(wù)器才能給響應(yīng),一次請求完畢后則斷開連接,以節(jié)省資源。服務(wù)器不能主動給客戶端響應(yīng)(除非采用http長連接技術(shù))。iPhone主要使用的類是NSURLConnection。

Socket是客戶端跟服務(wù)器直接使用Socket套接字進(jìn)行連接,并沒有規(guī)定連接后斷開,所以客戶端和服務(wù)器可以保持連接通道,雙方都可以主動發(fā)送數(shù)據(jù)。一般在游戲開發(fā)或股票開發(fā),這種要求即時性很強(qiáng)并且保持發(fā)送數(shù)據(jù)量比較大的場合使用。主要使用的類是CFSocketRef。

8.storyboard有什么特點(diǎn)?

storyboard是iOS5新增的特性,是對xib的升級版本,引入了一個容器用于管理多個xib文件,和它們之間的跳轉(zhuǎn)交互。

優(yōu)點(diǎn):不用再為每個控制器創(chuàng)建xib文件;可以使用靜態(tài)cell,當(dāng)cell固定且不多時,使用起來比較方便。

缺點(diǎn):storyboard單個文件,不利于團(tuán)隊(duì)協(xié)作開發(fā)。

9.如何打包靜態(tài)庫?

新建一個Framework&Library的項(xiàng)目,編譯的時候會將項(xiàng)目中的代碼文件打包成一個.a靜態(tài)庫文件。

10.APP發(fā)布的上架流程?

1)在蘋果官網(wǎng)的開發(fā)者中心,新建一個APP,填寫此APP相關(guān)的一些描述信息。

2)下載安裝發(fā)布證書。

3)選擇發(fā)布證書,使用Archive編譯發(fā)布包。

4)使用Xcode提交發(fā)布包。

11.iOS5有哪些新特性?

iCloud、定制UI、storyboard、ARC、CoreImage濾鏡、新增JSON解析類。

12.iOS6有哪些新特性?

UIRefreshControl水滴效果下拉刷新、UICollectionView控件的使用、SLComposeViewController新浪微博控件、PassKit中Passbook、AutoLayout自動布局。

13、iOS7有哪些新特性?

系統(tǒng):全新的UI設(shè)計(jì)與交互;Control Center控制中心;全新的多任務(wù)Multitasking;AirDrop共享文件;全新的Safari瀏覽器交互式體驗(yàn)。

SDK:動態(tài)UIKit,新增了UIDynamicItem委托,用來為UIView制定動態(tài)行為;新增游戲引擎Sprite Kit Framework框架,類似于Cocos2D。

14.ARC有什么特點(diǎn)?

ARC是編譯器特性,iOS5.0新添加的特性,使用ARC開發(fā)者不需要再retain、release、autorelease,因?yàn)榫幾g器會在合適的地方自動插入retain、release。

ARC不會因少release而導(dǎo)致內(nèi)存泄漏,過度使用release導(dǎo)致程序崩潰,

ARC可以產(chǎn)生更簡潔的代碼和更健壯的應(yīng)用。

15.SVN、Git協(xié)作開發(fā),怎么防止代碼文件沖突?

防止代碼沖突:不要多人同時修改同一個文件。例如,A、B都修改同一個文件,先讓A修改,然后提交到服務(wù)器,然后B更新下來,再進(jìn)行修改。

服務(wù)器上的項(xiàng)目文件xcodeproj,僅讓一個人管理提交,其他人只更新。防止此文件產(chǎn)生沖突。

第六部分

1.什么是ARC?

ARC是automatic reference counting自動引用計(jì)數(shù),在程序編譯時自動加入retain/release。在對象被創(chuàng)建時retain count+1,在對象被release時count-1,當(dāng)count=0時,銷毀對象。程序中加入autoreleasepool對象會由系統(tǒng)自動加上autorelease方法,如果該對象引用計(jì)數(shù)為0,則銷毀。那么ARC是為了解決MRC手動管理內(nèi)存存在的一些而誕生的。

MRC下內(nèi)存管理的缺點(diǎn):

1)釋放一個堆內(nèi)存時,首先要確定指向這個堆空間的指針都被release了。(避免提前釋放)

2)釋放指針指向的堆空間,首先要確定哪些指向同一個堆,這些指針只能釋放一次。(避免釋放多次,造成內(nèi)存泄露)

3)模塊化操作時,對象可能被多個模塊創(chuàng)建和使用,不能確定最后由誰釋放。

4)多線程操作時,不確定哪個線程最后使用完畢。

雖然ARC給我們編程帶來的很多好多,但也可能出現(xiàn)內(nèi)存泄露。如下面兩種情況:

1)循環(huán)參照:A有個屬性參照B,B有個屬性參照A,如果都是strong參照的話,兩個對象都無法釋放。

2)死循環(huán):如果有個ViewController中有無限循環(huán),也會導(dǎo)致即使ViewController對應(yīng)的view消失了,ViewController也不能釋放。

2.block一般用哪個關(guān)鍵字修飾,為什么?

block一般使用copy關(guān)鍵之進(jìn)行修飾,block使用copy是從MRC遺留下來的“傳統(tǒng)”,在MRC中,方法內(nèi)容的block是在棧區(qū)的,使用copy可以把它放到堆區(qū)。但在ARC中寫不寫都行:編譯器自動對block進(jìn)行了copy操作。

3.用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常

使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?

用@property聲明 NSString、NSArray、NSDictionary 經(jīng)常使用copy關(guān)鍵字,是因?yàn)樗麄冇袑?yīng)的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進(jìn)行賦值操作,為確保對象中的字符串值不會無意間變動,應(yīng)該在設(shè)置新屬性值時拷貝一份。

如果我們使用是strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性。

copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)。 當(dāng)屬性類型為NSString時,經(jīng)常用此特質(zhì)來保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個NSMutableString類的實(shí)例。這個類是NSString的子類,表示一種可修改其值的字符串,此時若是不拷貝字符串,那么設(shè)置完屬性之后,字符串的值就可能會在對象不知情的情況下遭人更改。所以,這時就要拷貝一份“不可變” (immutable)的字符串,確保對象中的字符串值不會無意間變動。只要實(shí)現(xiàn)屬性所用的對象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時拷貝一份。

4.runloop、autorelease pool以及線程之間的關(guān)系?

每個線程(包含主線程)都有一個Runloop。對于每一個Runloop,系統(tǒng)會隱式創(chuàng)建一個Autorelease pool,這樣所有的release pool會構(gòu)成一個像callstack一樣的一個棧式結(jié)構(gòu),在每一個Runloop結(jié)束時,當(dāng)前棧頂?shù)腁utorelease pool會被銷毀,這樣這個pool里的每個Object會被release。

[email protected] 的本質(zhì)是什么?ivar、getter、setter 是如何生成并添加到這個類中的?

“屬性”(property)有兩大概念:ivar(實(shí)例變量)、存取方法(access method=getter),即@property = ivar + getter + setter。

例如下面的這個類:

@interface WBTextView :UITextView  
@property (nonatomic,copy)NSString *placehold;  
@property (nonatomic,copy)UIColor *placeholdColor;  
@end

類完成屬性的定以后,編譯器會自動編寫訪問這些屬性的方法(自動合成autosynthesis),上述代碼寫出來的類等效與下面的代碼:

@interface WBTextView :UITextView  
- (NSString *)placehold;  
-(void)setPlacehold:(NSString *)placehold;  
-(UIColor *)placeholdColor;  
-(void)setPlaceholdColor:(UIColor *)placeholdColor;  
@end

詳細(xì)介紹見: http://blog.csdn.net/jasonjwl/article/details/49427377

6.分別寫一個setter方法用于完成 @property (nonatomic,retain)NSString *name 和 @property (nonatomic,copy) NSString *name ?

retain屬性的setter方法是保留新值并釋放舊值,然后更新實(shí)例變量,令其指向新值。順序很重要。假如還未保留新值就先把舊值釋放了,而且兩個值又指向同一個對象,先執(zhí)行的release操作就可能導(dǎo)致系統(tǒng)將此對象永久回收。

-(void)setName:(NSString *)name{
    [name retain];
    [_name release];
    _name = name;
}
-(void)setName:(NSString *)name{     
    [_name release];
    _name = [name copy];
}

7.說說assign和weak,_block和 _weak的區(qū)別?

assign適用于基本數(shù)據(jù)類型,weak是適用于NSObject對象,并且是一個弱引用。

assign其實(shí)也可以用來修飾對象,那么為什么不用它呢?因?yàn)楸籥ssign修飾的對象在釋放之后,指針的地址還是存在的,也就是說指針并沒有被置為nil。如果在后續(xù)內(nèi)存分配中,剛巧分到了這塊地址,程序就會崩潰掉。而weak修飾的對象在釋放之后,指針地址會被置為nil。

_block 是用來修飾一個變量,這個變量就可以在block中被修改。

_block :使用_block修飾的變量在block代碼塊中會被retain(ARC下,MRC下不會retain)。

_weak:使用_weak修飾的變量不會在block代碼塊中被retain。

8.請說出下面代碼是否有問題,如果有問題請修改?

@autoreleasepool {
        for (int i=0; i<largeNumber; i++) {
            Person *per = [[Person alloc] init];
            [per autorelease];
        }
    }

內(nèi)存管理的原則:如果對一個對象使用了alloc、copy、retain,那么你必須使用相應(yīng)的release或者autorelease。咋一看,這道題目有alloc,也有autorelease,兩者對應(yīng)起來,應(yīng)該沒問題。但autorelease雖然會使引用計(jì)數(shù)減一,但是它并不是立即減一,它的本質(zhì)功能只是把對象放到離他最近的自動釋放池里。當(dāng)自動釋放池銷毀了,才會向自動釋放池中的每一個對象發(fā)送release消息。這道題的問題就在autorelease。因?yàn)閘argeNumber是一個很大的數(shù),autorelease又不能使引用計(jì)數(shù)立即減一,所以在循環(huán)結(jié)束前會造成內(nèi)存溢出的問題。

解決方案如下:

@autoreleasepool {
        for (int i=0; i<100000; i++) { 
            @autoreleasepool {
            Person *per = [[Person alloc] init];
            [per autorelease];
        }
      }
    }

在循環(huán)內(nèi)部再加一個自動釋放池,這樣就能保證每創(chuàng)建一個對象就能及時釋放。

9.請問下面代碼是否有問題,如有問題請修改?

@autoreleasepool {
        NSString *str = [[NSString alloc] init];
        [str retain];
        [str retain];
        str = @"jxl";
        [str release];
        [str release];
        [str release];
}

這道題跟第8題一樣存在內(nèi)存泄露問題,

1)內(nèi)存泄露 ;

2)指向常量區(qū)的對象不能release。

指針變量str原本指向一塊開辟的堆區(qū)空間,但是經(jīng)過重新給str賦值,str的指向發(fā)生了變化,由原來指向堆區(qū)空間,到指向常量區(qū)。常量區(qū)的變量根本不需要釋放,這就導(dǎo)致了原來開辟的堆區(qū)空間沒有釋放,造成內(nèi)存泄露。

10.什么情況下使用weak關(guān)鍵字,相比assign有什么不同?什么情況使用weak關(guān)鍵字?

1)在ARC中,在有可能出現(xiàn)循環(huán)引用的時候,往往要通過讓其中一端使用weak來解決。比如delegate代理。

2)自身已經(jīng)對它進(jìn)行一次強(qiáng)引用,沒有必要再強(qiáng)引用一次,此時也會使用weak,自定義控件屬性一般也使用weak。

不同點(diǎn):

1)weak此特性表明該屬性定義了一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時,設(shè)置方法既不保留新值,也不釋放舊值。此特性與assign一樣,然而在屬性所指的對象遭到銷毀時,屬性值也會清空。而assign的“設(shè)置方法”只會執(zhí)行針對“純量類型” (scalar type,例如 CGFloat 或 NSlnteger 等)的簡單賦值操作。

2)assign可以用非OC對象,而weak必須用于OC對象。

11.內(nèi)存管理語義(assign、strong、weak等的區(qū)別)?

1)assign “設(shè)置方法” 只會執(zhí)行針對“純量”的簡單賦值操作。

2)strong 此特性表明該屬性定義了一種“擁有關(guān)系”。為這種屬性設(shè)置新值時,設(shè)置方法會先保留新值,并釋放舊值,然后再將新值設(shè)置上去。

3)weak 此特性表明該屬性定義了一種“非擁有關(guān)系”。為這種屬性設(shè)置新值時,設(shè)置方法既不保留新值,也不釋放舊值。此特性同assign類似,然而在屬性所指的對象遭到銷毀時,屬性值也會清空。

4)unsafe_unretained 此特性的語義和assign相同,但是它適用于“對象類型”,該特性表達(dá)一種“非擁有關(guān)系”,當(dāng)目標(biāo)對象遭到銷毀時,屬性值不會自動清空,這一點(diǎn)與weak有區(qū)別。

5)copy 此特性所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值,而是將其“拷貝”。當(dāng)屬性類型為NSString*時,經(jīng)常用此特性來保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個NSMutableString類的實(shí)例。這個類是NSString的子類,表示一種可以修改其值的字符串,此時若是不拷貝字符串,那么設(shè)置完屬性之后,字符串的值就可能會在對象不知情的情況下遭人更改。所以,這時就要拷貝一份“不可變”的字符串,確保對象中的字符串值不會無意間變動。只要實(shí)現(xiàn)屬性所用的對象是“可變的”,就應(yīng)該在設(shè)置新屬性值時拷貝一份。

 

來自:http://charsdavy.github.io/2017/03/28/ios-interview/

 

標(biāo)簽: isp ssl web服務(wù)器 安全 代碼 服務(wù)器 服務(wù)器端 開發(fā)者 數(shù)據(jù)庫 通信

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Python 中 "is" 與 "==" 操作有什么區(qū)別?

下一篇:Java線程內(nèi)存模型,線程、工作內(nèi)存、主內(nèi)存