iOS總結

iOS總結


面試心聲:其實這些題本人都沒怎麼背,但是在上海 兩週半 面了大約10家  收到差不多3個offer,總結起來就是把基礎的東西弄好,複雜的東西瞭解就ok了!

*注:如今社會還是得靠本事,面試題60分只是多了一個機會,珍惜機會的同時提高自己硬實力纔是真理!

1.給定一個字符串,輸出本字符串中只出現一次並且最靠前的那個字符的位置?比如“abaccddeeef”則是b,輸出2

答: int main()

{

char a[80] = "abaccddeeef\0";

char ch;

int i, m, b[80];

int flag = 0;

ch = getchar();//獲取一個字符

m = strlen(a);

for (i = 0; i < m; ++i){

if (a[i] == ch){//找到了,直接判斷是否相等

b[flag] = i+1;//記錄位置

flag += 1;

}

}

if (flag == 0)printf ("no");

else {

printf ("%d\n", flag);

for (i = 0; i < flag; i++){//對位置進行輸出,用循環

printf ("%d ", b[i]);

}

printf ("\n");

}

return 0;

}

2.實現一個冒泡排序或者快速排序

答:冒泡排序:

intarray[5] = { 28,27,36,45,8};

for (int i = 0; i < 4; i++) {

for(int j = 0; j < 4; j++) {

if (array[j] > array [j + 1]){

int temp = array[j];

array[j] = array[j + 1];

array[j + 1] = temp;

}}}

for(int i = 0; i < 5; i++) {

printf("%d\n",array[i]);}

3.請編寫一個函數用於計算階乘

答: int f(int i)

{intt=1,j;

for(j=1;j<=i;j++)

t=t*j;

return t;

}

4.Cocoa Touch提供了幾種Core

Animation過渡類?

答:Cocoa Touch提供了4種Core

Animation過渡類型,分別爲:交叉淡化、推擠、顯示和覆蓋。

5.iOS平臺怎麼做數據的持久化?coredata和sqlite有無必然聯繫?coredata是一個關係型數據嗎?

答:數據的持久化本質上都是就是寫文件,但從邏輯上又分成很多種,比如寫入沙盒,比如存到網絡上,比如寫入數據庫。

core data是對sqlite的封裝,因爲sqlite是c語言的api,然而有人也需要obj-c的api,所以有了core data ,另外,core data不僅僅是把c的api翻譯成oc的api,還提供了一些管理的功能,使用更加方便。

App升級之後數據庫字段或者表有更改會導致crash,CoreData的版本管理和數據遷移變得非常有用,手動寫sql語句操作還是麻煩一些。

CoreData不光能操縱SQLite,CoreData和iCloud的結合也很好,如果有這方面需求的話優先考慮CoreData。

CoreData並不是直接操縱數據庫,比如:使用CoreData時不能設置數據庫的主鍵,目前仍需要手動操作。

6.Object-c的類可以多重繼承麼?可以實現多個接口麼?category是什麼?重寫一個類的方式用繼承好還是分類好?爲什麼?

答: Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

7.#import跟#include有什麼區別,@class呢?#import<>跟#import””有什麼區別?

答: #import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重複導入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,可以解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import””用來包含用戶頭文件。

8.屬性readwrite,readonly,assin,retain,copy,nonatomic各是什麼作用,在哪種情況下用?

答: readwrite是可讀可寫特性;需要生成getter方法和setter方法時

readonly是隻讀特性只會生成getter方法不會生成setter方法;不希望屬性在類外改變

assign是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

retain表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy表示拷貝特性,setter方法將傳入對象複製一份;需要完全一份新的變量時。

nonatomic非原子操作,決定編譯器生成的setter

getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic

9.寫一個setter方法用於完成@property(nonatomic,

retain)NSString *name;寫一個setter方法用於完成@property(nonatomic, copy)NSString *name;

答: -(void)setName:(NSString *) str

{

[str retain];

[name release];

name = str;

}

- (void)setName:(NSString *)str

{

id t = [str copy];

[name release];

name = t;  }

10.對於語句NSString *obj =

[[NSData alloc] init]; obj在編譯時和運行時分別是什麼類型的對象?

答:編譯時是NSString的類型;運行時是NSData類型的對象

11.當前已經編程實現函數:int

rand100().該函數可返回0~99的隨機整數,且可以保證等概率.請利用該函數實現int rand10000(),要求等概率返回0~9999的隨機數.(不可使用其他的系統函數)

12.湯姆現在要在家裏舉行宴會,他雖然有很多筷子,但這些筷子的長度並不完全相同,先已知每根筷子的長度,要求每位客人都能拿到兩根長度相同的筷子

,求最多可邀請的客人數.

編程實現:int getMax(int arrLength[N])

13.現有一個整數序列,你可以交換其中的任意兩個數以得到一個新序列.求共能得到多少種可能結果.(注意:3,3,3,3無論怎麼交換,只能得到一個序列)

編程實現:int getTotal(int arrOrigin[N])

14.現有一個M行N列的數組,要求安裝反向斜對角線(右上->左下)的方式,打印該數組.編程實現:intprintMatrix[int arrMatrix[M][N]]

下面樣例的打印順序爲:

0->1->4->2->5->8->3->6->9->7->10->11

123

4567

8910 11

15.在UIKit中,frame與bounds的關係是( C )

A. frame是bounds的別名

B. frame是bounds的繼承類

C. frame的參考系是父規圖座標, bounds的參考系是自身的座標

D.frame的參考系是自身座標,bounds的參考系是父規圖的座標

16.一個類的delegate(代理)的作用不正確的是( D )

A.delegate中的函數在其他類中實現

B.主要用於不同類型的對象之間一對一傳遞消息

C.沒有指派則不會觸發

D.可以一個對象的delegate指派給多個其他類型的對象

17.下面關於Objective-C內存管理的描述錯誤的是(A )

A.當使用ARC來管理內存時,對象的retain,dealloc方法不會被調用

B.autoreleasepool在drain的時候會釋放在其中分配的對象

C.當使用ARC來管理內存時,在線程中大量分配對象而不用autoreleasepool則可能會造成內存泄露

D.在使用ARC的項目中不能使用NSZone

18.下面block定義正確的是( A )

A.tyoedef void(^SuccessBlock)(BOOLsuccess);

B. tyoedef void(^SuccessBlock)(NSStringvalue,BOOL success);

C. tyoedef void^(SuccessBlock)(NSStringvalue,BOOL success);

D. tyoedef void^(SuccessBlock)(NSString*value);

19.UIButton從子類到父類一次繼承自:( D )

A. UIView-> UIViewController->UIController

B. UIResponder-> UIControl-> UIView

C. UIControl-> UIResponder->UIViewController

D. UIControl-> UIView-> UIResponder

20.下列關於iOS開發中類方法的使用描述,錯誤的是:( C )

A.類方法可以調用類方法

B.類方法不可以調用實例方法,但是類方法可以通過創建對象來訪問實例方法

C.類方法不可以使用實例變量,包括self(可以使用self)

D.類方法作爲消息,可以被髮送到類或者對象裏面去

31.什麼情況下使用關鍵字weak和assign有何不同?

答:assign指針賦值,不對引用計數操作,使用之後如果沒有置爲nil,可能就會產生野指針;而weak一旦不進行使用後,永遠不會使用了,就不會產生野指針!

32.Object-C的類可以多重繼承麼?可以實現多個接口麼?Category是什麼?重寫一個類方法的方法用繼承好還是分類好?爲什麼?

答: Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

32.如何用iOS設備進行性能測試?

答: Profile-> Instruments ->Time Profiler

33.我們說的oc是動態運行時語音是什麼意思?

答案:多態。主要是將數據類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來說,運行時機制使我們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。因此也可以說,運行時機制是多態的基礎。

34.你的項目什麼時候選擇使用GCD,什麼時候選擇NSOperation?

答:項目中使用NSOperation的優點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具有面向對象的優點(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。項目中使用GCD的優點是GCD本身非常簡單、易用,對於不復雜的多線程操作,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。

35.讀文件是輸入流還是輸出流?

東西讀入內存就是輸入流東西從內存寫到記錄存儲輸出流而我們本身就以記錄存儲爲原點所有會有不解的感覺~java io流按照java io流的方向可以分爲輸入流和輸出流輸入流是將資源數據讀入到緩衝Buffer中,輸出流是將緩衝Buffer中的數據按照指定格式寫出到一個指定的位置,所以這兩個流一般同時使用,纔有意義。例如你要做文件的上傳,你要先用輸入流將待上傳文件讀入緩衝,然後用輸出流將文件寫出到網絡服務器的一個位置,則上傳成功;若是文件下載,則先獲得輸入流,來讀取網絡服務器中的一個文件,然後用輸出流寫到本地的一個文件中;還有例如文件的拷貝,也是先用輸入流讀再用輸出流寫出去的很好的例子,你可以先做一個小例子試試,對你理解java io有幫助

36.簡述CALayer和UIView的關係

答:UIView和CALayer是相互依賴的關係。UIView依賴與calayer提供的內容,CALayer依賴uivew提供的容器來顯示繪製的內容。歸根到底CALayer是這一切的基礎,如果沒有CALayer,UIView自身也不會存在,UIView是一個特殊的CALayer實現,添加了響應事件的能力。

結論:

UIView來自CALayer,高於CALayer,是CALayer高層實現與封裝。UIView的所有特性來源於CALayer支持。

37.聲明一個靜態方法和一個實例方法

答:先說實例方法,當你給一個類寫一個方法,如果該方法需要訪問某個實例的成員變量時,那麼就將該方法定義成實例方法。一類的實例通常有一些成員變量,其中含有該實例的狀態信息。而該方法需要改變這些狀態。那麼該方法需要聲明成實例方法。

靜態方法正好相反,它不需要訪問某個實例的成員變量,它不需要去改變某個實例的狀態。我們把該方法定義成靜態方法。

38.常見的Object-C的數據類型有哪些?和Cd基本數據類型有什麼區別?

答: object-c的數據類型有nsstring,nsnumber,nsarray,nsmutablearray,nsdata等等,這些都是class,創建後便是對象,而c語言的基本數據類型int,只是一定字節的內存空間,用於存放數值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成複雜的操作。

39.UIView的動畫效果有哪些

如UIViewAnimationOptionCurveEaseInOut

UIViewAnimationOptionCurveEaseIn

UIViewAnimationOptionCurveEaseOut

UIViewAnimationOptionTransitionFlipFromLeft

UIViewAnimationOptionTransitionFlipFromRight

UIViewAnimationOptionTransitionCurlUp

UIViewAnimationOptionTransitionCurlDown

40.你瞭解svn,cvs等版本控制工具麼?

答:瞭解.

41.靜態鏈接庫(瞭解一下)

答:靜態庫是程序代碼的集合,是共享代碼的一種方式

靜態庫是閉源的存在形式.a和.framework

連接時,靜態庫會被完全的複製到可執行文件中,被多次使用就會有冗餘拷貝,相當於java裏的jar包,把一些類編譯到一個包中,在不同的工程中如果導入此文件就可以使用裏面的類,

42.什麼是沙箱模型?哪些操作是屬於私有api範疇?

答:1、應用程序可以在自己的沙盒裏運作,但是不能訪問任何其他應用程序的沙盒。

2、應用程序間不能共享數據,沙盒裏的文件不能被複制到其他應用程序文件夾中,也不能把其他應用程序文件夾中的文件複製到沙盒裏。

3、蘋果禁止任何讀、寫沙盒以外的文件,禁止應用程序將內容寫到沙盒以外的文件夾中。

4、沙盒根目錄裏有三個文件夾:Documents,一般應該把應用程序的數據文件存到這個文件夾裏,用於存儲用戶數據或其他應該定期備份的信息。Library,下有兩個文件夾,Caches存儲應用程序再次啓動所需的信息,Preferences包含應用程序偏好設置文件,不過不要在這裏修改偏好設置。temp,存放臨時文件,即應用程序再次啓動不需要的文件。

沙盒根目錄裏有三個文件夾分別是:documents,tmp,Library。

1、Documents目錄:您應該將所有de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。

2、AppName.app目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啓動。

3、Library目錄:這個目錄下有兩個子目錄:Caches和Preferences

Preferences目錄:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.

Caches目錄:用於存放應用程序專用的支持文件,保存應用程序再次啓動過程中需要的信息。

4、tmp目錄:這個目錄用於存放臨時文件,保存應用程序再次啓動過程中不需要的信息。

iOS沙盒(sandbox)中的幾個目錄獲取方式:

//獲取沙盒主目錄路徑

NSString *homeDir = NSHomeDirectory();

//獲取Documents目錄路徑

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *docDir = [paths objectAtIndex:0];

//獲取Caches目錄路徑

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *cachesDir = [paths objectAtIndex:0];

//獲取tmp目錄路徑

NSString *tmpDir =  NSTemporaryDirectory();

//獲取當前程序包中一個圖片資源(apple.png)路徑

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];

UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

例子:

NSFileManager* fm=[NSFileManagerdefaultManager];

if(![fm fileExistsAtPath:[selfdataFilePath]]){

//下面是對該文件進行制定路徑的保存

[fm createDirectoryAtPath:[selfdataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];

//取得一個目錄下得所有文件名

NSArray *files = [fm subpathsAtPath: [selfdataFilePath] ];

//讀取某個文件

NSData *data = [fm contentsAtPath:[selfdataFilePath]];

//或者

NSData *data = [NSDatadataWithContentOfPath:[self dataFilePath]];

}

43.協議是什麼?有什麼作用?

協議:聲明一系列的方法,可由任何類實施,即使遵守該協議的類沒有共同的超類。協議方法定義了獨立於任何特定類的行爲。簡單的說,協議就是定義了一個接口,其他類負責來實現這些接口。如果你的類實現了一個協議的方法時,則說該類遵循此協議。

協議的作用:

1.定義一套公用的接口(Public)

@required:必須實現的方法

@optional:可選實現的方法(可以全部都不實現)

2.委託代理(Delegate)傳值:

它本身是一個設計模式,它的意思是委託別人去做某事。

比如:兩個類之間的傳值,類A調用類B的方法,類B在執行過程中遇到問題通知類A,這時候我們需要用到代理(Delegate)。

又比如:控制器(Controller)與控制器(Controller)之間的傳值,從C1跳轉到C2,再從C2返回到C1時需要通知C1更新UI或者是做其它的事情,這時候我們就用到了代理(Delegate)傳值。

44.你在開發大型項目時,如何進行內存泄露檢測的?

可以通過xcode的自帶工具run---start with performance tool裏有instruments下有個leaks工具,

啓動此工具後,運行項目,工具裏可以顯示內存泄露的情況,雙擊可找到源碼位置,可以幫助進行內存泄露的處理。

45.你實現過一個框架或者庫以供別人使用麼?如果有,請談一談構建框架或者庫是的經驗;如果沒有,請設想和設計框架的public的API,並指出大概需要如何做,需要注意一些什麼方面,來方便別人容易地使用你的框架.

46.app從創建應用到上架過程(appstore)

在你開始將程序提交到App Store之前,你需要有一個App ID,一個有效的發佈證書,以及一個有效的Provisioning profile。

在itunesconnect網站上,創建app應用,設置對應信息,上傳app打包文件,提交等待審覈

47.用你熟悉的語音,編程實現Fibonacci數列:int F(intn);

Fibonacci數列遞推式F(n) = F(n-1) +F(n-2)

F(1) = 1

F(2) = 2

F(3) = 3

F(4) = 5

F(5) = 8

int F(int n){

if(n == 1){

return1;

}

return f(n-1)+f(n-2);

}

48.給定兩個排好序的數組A,B,請寫一個函數,從中找出他們的公共元素:findCommon(A,

B)並列舉其他可能的查找方法,越多越好

例如:

Array A = [1, 3, 5, 6, 9]

Array B = [2, 3, 6, 8, 10]

返回結果= [3, 6]

void FindCommon(int* a, int* b, int n)

{

int i = 0;

int j = 0 ;

while(i < n && j < n){

if (a[i] < b[j])

++i ;

else if(a[i] == b[j])

{

cout << a[i] << endl ;

++i ;

++j ;

}

else// a[i] > b[j]

++j ;

}

51.KVO的實現原理?

答:KVO:當指定的對象的屬性被修改了,允許對象接收到通知的機制。

52.如何給一個對象的私有屬性賦值?

答:利用KVC即鍵值編碼來給對象的私有屬性賦值.

53.block的本質是什麼?爲啥在block裏面更改外面變量的值,要給外面的變量加_block修飾,加_block修飾的原理是什麼?

答: (1) block本質是一個數據類型,多用於參數傳遞,代替代理方法, (有多個參數需要傳遞或者多個代理方法需要實現還是推薦使用代理方法),少用於當做返回值傳遞. block是一個OC對象,它的功能是保存代碼片段,預先準備好代碼,並在需要的時候執行.

(2)因爲使用block代碼塊可能會引起內部循壞引用,所以應在block定義前加上修飾

54.block在哪種情況下會造成循環引用,如何解決?

答:(1)從兩方面分析造成循環引用問題

當self擁有一個block的時候,在block又調用self的方法(或者self所擁有的某個屬性)。形成你中有我,我中有你,這種時候會造成循環引用

把某個實例變量變成本地臨時變量,強引用將直接指向這個本地臨時變量,但本地臨時變量一般都會很快釋放,所以一般考慮第一種情況

(2)解決方案:對block進行修飾__weak(arc)或__block(mrc)

55.NSURLSession在什麼情況下回存在循環引用的問題,怎麼解決?

答: (1)在使用NSURLSession簽訂其代理的時候會存在循環引用問題,因爲其代理是retain強引用

(2)解決方案

(1)在下載完成後取消NSURLSession會話並釋放Session,賦值爲nil。

(2)再視圖將要消失時也執行同樣的操作。爲了防止沒有下載完成就跳轉控制器。

具體如下:

/**視圖將要消失的時候,取消session*/

- (void)viewWillDisappear:(BOOL)animated

{

[superviewWillDisappear:animated];

//任務完成,取消NSURLSession

[self.sessioninvalidateAndCancel];

//釋放會話

self.session =nil;

}

56.如何自己實現GET緩存?

答:1.使用GET請求數據

2.iOS系統SDK已經做好了緩存。需要的僅僅是設置下內存緩存大小、磁盤緩存大小、以及緩存路徑,代碼如下

NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:urlCache];

57.在使用SQLite過程中,如果多條線程同時操作同一數據庫會造成什麼問題,怎麼解決?

答:(1)容易造成系統崩潰

(2)解決方案:開啓第3種串行模式,使用一個類(單例方式)操作數據庫

58.如果提交一個Json格式的數據給後臺服務器,後臺服務器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分別如何實現?

答:1.使用NSURLConnection發送請求的步驟很簡單

(1)創建一個NSURL對象,設置請求路徑(設置請求路徑)

(2)傳入NSURL創建一個NSURLRequest對象,設置請求頭和請求體(創建請求對象)

(3)使用NSURLConnection發送NSURLRequest(發送請求)

2.使用NSURLSession發送請求的步驟很簡單

1)確定請求路徑(一般由公司的後臺開發人員以接口文檔的方式提供),GET請求參數直接跟在URL後面

2)創建請求對象(默認包含了請求頭和請求方法【GET】),此步驟可以省略

3)創建會話對象(NSURLSession)

4)根據會話對象創建請求任務(NSURLSessionDataTask)

5)執行Task

6)當得到服務器返回的響應後,解析數據(XML|JSON|HTTP)

59.請描述一下SDWebImage內部實現的原理

答:SDWebImage底層實現有沙盒緩存機制,主要由三塊組成

1、內存圖片緩存

2、內存操作緩存

3、磁盤沙盒緩存

60.你對runtime都有哪些瞭解,你在實現開發過程中,或是你在所使用的第三方框架中,有沒有使用過runtime的,如果有,請你描述一下其內部實現機制

答:Runtime:runtime是一套比較底層的純C語言API,屬於1個C語言庫,包含了很多底層的C語言API。在我們平時編寫的OC代碼中,程序運行過程時,其實最終都是轉成了runtime的C語言代碼, runtime算是OC的幕後工作者.

(http://www.w2bc.com/article/126999網址中搜索:其實最終都是轉成了runtime的C語言代碼)

61.線程間怎麼通信?

(1)GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//下載圖片

UIImage *image = nil;

dispatch_async(dispatch_get_main_queue(),^{

//回到主線程

});

(2)NSThread的線程通信

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//下載圖片

UIImage *image = nil;

[selfperformSelector:@selector(settingImage:) onThread:[NSThread mainThread]withObject:image waitUntilDone:YES modes:nil];

}

這種情況也適用於子線程之間的通信。

62.網絡圖片處理問題中怎麼解決一個相同的網絡地址重複請求的問題?

答案:利用字典圖片地址爲key,下載操作爲value

63.自動釋放池底層怎麼實現?

答:自動釋放池以棧的形式實現:當你創建一個新的自動釋放池時,它將被添加到棧頂.當一個對象收到發送autorelease消息時,他被添加到當前線程的處於棧頂的自動釋放池中,當自動釋放池被回收時,他們從棧中被刪除,並且會給池子裏面所有的對象都會做一次release操作

64.不用中間變量,用兩種方法交換A和B的值

A = A+B;

B = A - B;

A = A - B;

65.簡單描述一下客戶端的緩存機制?

答案:無法簡述,詳細瞭解下,明白了夠裝逼就好http://www.cnblogs.com/wendingding/p/3950198.html

66.控制器View的生命週期及相關函數是什麼?你在開發中是如何用的?

>1.在視圖顯示之前調用viewWillAppear;該函數可以調用多次;

>2.視圖顯示完畢,調用viewDidAppear;

>3.在視圖消失之前調用viewWillDisAppear;該函數可以調用多次(如需要);

>4.在佈局變化前後,調用viewWill/DidLayoutSubviews處理相關信息;

67.NSRunLoop的實現機制,及在多線程中如何使用?

答案:NSRunLoop是iOS的消息機制的處理模式

>1NSRunloop的主要作用:控制runloop裏面線程的執行和休眠,在有事情做的時候使擋牆NSRunloop控制的線程工作,沒有事情做讓當前runloop的控制線程休眠.

>2.runloop就是一直在循環檢測,從線程start到線程end,檢測inputsourse(如點擊,雙擊等操作)異步時間,檢測timesourse同步事件,見到檢測到輸入源會執行處理函數,首先會產生通知,corefunction向線程添加runloop observers來監聽事件,意在監聽事件發生時來做處理。

>3.runloopmode是一個集合,包括監聽:事件源,定時器,以及需通知的runloop observers

>1.只有在爲你的程序創建次線程的時候,才需要運行run loop。對於程序的主線程而言,run loop是關鍵部分。Cocoa提供了運行主線程run loop的代碼同時也會自動運行run loop。IOS程序UIApplication中的run方法在程序正常啓動的時候就會啓動run loop。如果你使用xcode提供的模板創建的程序,那你永遠不需要自己去啓動run loop

>2.在多線程中,你需要判斷是否需要run loop。如果需要run loop,那麼你要負責配置run loop並啓動。你不需要在任何情況下都去啓動run loop。比如,你使用線程去處理一個預先定義好的耗時極長的任務時,你就可以毋需啓動run loop。Run loop只在你要和線程有交互時才需要

68.簡單說一下APP的啓動過程,從main文件開始說起

進入main函數,在main.m的main函數中執行了UIApplicationMain這個方法,這是ios程序的入口點!

int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)

argc、argv:ISO C標準main函數的參數,直接傳遞給UIApplicationMain進行相關處理即可

principalClassName:指定應用程序類,該類必須是UIApplication(或子類)。如果爲nil,則用UIApplication類作爲默認值

delegateClassName:指定應用程序類的代理類,該類必須遵守UIApplicationDelegate協議

此函數會根據principalClassName創建UIApplication對象,根據delegateClassName創建一個delegate對象,並將該delegate對象賦值給UIApplication對象中的delegate屬性

lUIApplication對象會依次給delegate對象發送不同的消息,接着會建立應用程序的main runloop(事件循環),進行事件的處理(首先會調用delegate對象的application:didFinishLaunchingWithOptions:)

程序正常退出時這個函數才返回。如果進程要被系統強制殺死,一般這個函數還沒來得及返回進程就終止了

69.第三方API你是怎麼用的?

cocoa pod導入

70.用預處理指令#define聲明一個常數,用以表明一年中有多少秒?(忽略閏年問題)

答:#define second 365*24*60*60

91.UITableView需要實現哪些代理?列出UITableView代理中必須實現的與其他一些常用的函數.

答:

-( NSInteger )tableView:( UITableView *)tableViewnumberOfRowsInSection:( NSInteger)section;

一組有多少行

-( UITableViewCell *)tableView:( UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;

每行中的cell的實現以上兩個方法爲必須要實現的

常用的有

- ( void )tableView:( UITableView *)tableViewdidSelectRowAtIndexPath:( NSIndexPath*)indexPath

選中以後事件設置

-( CGFloat )tableView:( UITableView *)tableViewheightForRowAtIndexPath:( NSIndexPath*)indexPath

設置cell的高度

等等。。。。。

92.在iOS上開發一個應用程序時怎麼做的?

答:首先,要有一個MAC系統(買一臺蘋果電腦,蘋果本或者MACmini),沒有這個條件可以裝一個黑蘋果的mac系統或者裝一個虛擬機。然後裝一個X-CODE開發環境。要是學習ios開發的話,這些就可以了。如果要開發、上線的話,就得準備iphone/ipod、ipad做爲測試機,到蘋果申請一個開發者賬號,每年的年費99美元。再然後接着就可以開發你的程序了,開發完畢之後,發佈到App store上面,通過審覈就可以了。

*93.C++和Objective-C的混合使用,以下描述錯誤的是()

//未找到答案或是C++JAVA

A. cpp文件只能使用C/C++代碼

B. cpp文件include的頭文件中,可以出現objective-C的代碼

C. mm文件中混用cpp直接使用即可

D. cpp使用objective-C的關鍵是使用接口,而不能直接使用代碼

*94.以下哪一段代碼不會拋出異常( C& D )

A. NSArray *array = @[1, 2, 3];NSNumber*number = array[3];// @[@1,@ 2,@ 3]

B. NSDictionary *dict = @{@”key”:

nil};//value不能爲空

C. NSString *str = nil; NSString *str2 =[str substringFromIndex:3];

D. NSString *str = @”hi”;NSString *str2 =[str substringFromIndex:3];

*95.在沒有navigationController的情況下,要從一個ViewController切換到另一個ViewController應該()

A.{self.navigationControllerpushViewController:nextViewController animated:YES};

B.{self .viewaddSubview:nextViewController}

C. {selfpresentModalViewController:nextViewController animated:YES};

D. {selfpushViewController:nextViewController animated:YES};

分析:A、C都需要有navigationController,B一個控制器的view是無法加載另一個控制器的view的,所以選C!

*96.關於下面線程管理錯誤的是()

//不確定

A.GCD在後端管理着一個線程池

B.NSOperationQueue是對NSthread的更高層的封裝,對

C.NSThread需要自己管理線程的生命週期

D.GCD可以根據不同優先級分配線程,對

*97.iOS中的數據持久化方式(D)

A.屬性列表

B.對象歸檔

C.SQLite和CoreData

D.以上全部+對象歸檔

98.設有一下宏定義:

#defineN4

#defineY(n)((N + 1) * n)

則執行語句: Y(5 + 1)爲:(26)

99.如下程序用於把"blue"字符串返回,請指出其中的錯誤.

//不確定

char *GetBlue()

{

char *pcColor;

char*pcNewColor;

pcColor = “blue”;

pcNewColor =(char*)malloc(strlen(pcColor));

strcpy(pcNewColor, pcColor);

return pcNewColor;

}

答:strcpy是一個字符串拷貝的函數,它的函數原型爲strcpy(char *dst, c*****t char *src);將src開始的一段字符串拷貝到dst開始的內存中去,結束的標誌符號爲'\0',由於拷貝的長度不是由我們控制的,所以這個字符串拷貝很容易出錯

100.常見的object-c的數據類型有哪些,和C的基本數據類型有什麼區別?如:NSInteger和int

答:object的數據類型由NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創建後便是對象,而C語言的基本數據類型int,只是一定字節的內存空間,用於存放數值,NSInteger是基本的數據類型,並不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本數據類型int或者Long的別名(NSInteger的定義typedef long NSInteger)它的區別在於,NSInteger會根據系統是32位還是64位來決定是本身int還是long.

101.iOS有垃圾回收機制嗎?它是以怎樣的機制來工作的?

答: OC是支持垃圾回收機制的(Garbage collection簡稱GC),但是apple的移動終端中,是不支持GC的,Mac桌面系統開發中是支持的.

移動終端開發是支持ARC(Automatic

Reference Counting的簡稱),ARC是在IOS5之後推出的新技術,它與GC的機制是不同的。我們在編寫代碼時,不需要向對象發送release或者autorelease方法,也不可以調用delloc方法,編譯器會在合適的位置自動給用戶生成release消息(autorelease),ARC的特點是自動引用技術簡化了內存管理的難度.

102.請使用gcd完成如下任務,執行併發任務task1,task1完成後update UI.

答:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//task1:

NSLog(@"執行task1");

//更新UI

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"更新UI");

});

});

103.爲什麼在主線程中更新UI?子線程中想要更新UI怎麼做?

答:(1)在子線程中不能更新UI,除了極少數UI外,其他UI更新要等到子線程執行完畢後回到主線程中進行更新。如果子線程一直在運行,則子線程中UI更新的函數棧主線程無法得知,即UI無法更新;

(2)回到主線程中進行UI更新;

104.簡述通過Storyboard實現一個tableView

(自定義cell的關鍵步驟).

答:首先創建自己的自定義cell的類,我們叫做CustomCell,要繼承於UITableViewCell。在這個類中定義自己所需要的控件。

然後,打開storyboard,選擇自己要添加自定義cell的UIViewController,我們叫它爲ViewController。在UITableView裏面添加一個cell(或者修改原有的cell)。將cell的style改爲custom,將cell的類改爲CustomCell,將identifier改爲CustomCellIdentifier。然後,可以在cell中添加控件,將控件和剛纔在CustomCell中定義的控件連起來。

最後,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中添加以下代碼:

[plain]

CustomCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"CustomCellIdentifier"];

這樣,就創建了一個cell,可以在這句代碼之後對自己添加的控件進行設置。

105.如何生成同時支持多個架構(simulator,arm7,arm64)的通用靜態庫?

答:ValidArchitectures設置爲:armv7|armv7s|arm64|i386|x86_64;

Architectures設置不變(或根據你需要):armv7|arm64;

然後分別選擇iOS設備和模擬器進行編譯,最後找到相關的.a進行合包,使用lipo -create真機庫.a的路徑模擬器庫.a的的路徑-output合成庫的名字.a;

這樣就製作了一個通用的靜態庫.a;

106.請寫出一個xml文件,用於描述一個書架,書架上有2本書,書本的類別(category)分別是cooking,children.要求tag中包含書名(title),作者(author).類別(category)要用屬性表示.

答:

書名1<\title>

作者1<\author>

<\book>

書名2<\title>

作者2<\author>

<\book>

107.strcpy和memcpy的最大區別是什麼?

答:1、複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符數組、整型、結構體、類等。

2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第

3個參數決定複製的長度。

3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy

108.g++, ld是什麼?聲明編譯選項–DSUPPORT_BLUETOOTH =

1有什麼作用?

答: g++是GNU的c++編譯器;

109.@class用途

答:@class一般用於頭文件中聲明某個類的實例變量的時候用到.它只是聲明,至於內部的實現是沒有告訴編譯器的.

110.delegate使用assign or retain簡述理由.

答:assign,防止出現循環引用;

111.NSString與NSData之間的轉換過程中要特別注意的事項是什麼?

解:NSString轉換成NSData對象

NSData* xmlData = [@"testdata"dataUsingEncoding:NSUTF8StringEncoding];

NSData轉換成NSString對象

NSData * data;

NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

NSData轉換成char*

NSData *data;

char *test=[data bytes];

char*轉換成NSData對象

byte* tempData = malloc(sizeof(byte)*16);

NSData *content=[NSData dataWithBytes:tempData length:16];

轉換過程中要注意NSData的編碼格式問題.

解決方法:

先設置斷點然後在控制檯po出NSData的變量,看看會顯示什麼。

如果po出的NSData是可閱讀的,直接能看到文本的內容,則使用[NSString stringWithFormat:NSData] (這裏的NSData指的是你需要轉換成NSString的NSData變量)即可。

如果po出的NSData是不可閱讀的亂碼,那一般都是有編碼格式的,最常用的是NSUTF8StringEncoding,另外還有NSASCIIStringEncoding等,你可以在Apple文檔裏找到編碼格式的那個枚舉類型,挨個嘗試。

112.請用代碼如何判斷某個對象obj是否支持某個method.

解:if ([srespondsToSelector:@selector(print:)]) {

[s print:@"支持這個方法"];

}

113.請用簡單的代碼展示@protocol的定義及實現.

解: #warning代理第一步:聲明協議

@protocol MarryMe

-(void)makeMoney;

@end

#warning代理第二步:聲明代理

@property(nonatomic,assign)id myDeleget;

.m文件中

#warning代理第三步:代理人執行協議方法

[self.myDeleget makeMoney];

代理人.m文件中

#warning代理第四步:簽訂協議

@interface Boy : NSObject

Girl *girl = [[Girl alloc] init];

#warning代理第五步:成爲代理人

girl.myDeleget = self;

[girl getMessage:message];

#warning協議代理第六步:實現協議方法

-(void)makeMoney{

NSLog(@"aaa");

}

/*不是iOS的題*/114.請講述Indesign中主頁作用

115.請描述應聘崗位的未來職業規劃

解:答案不唯一,如有需要請自行規劃活着百度.

116.3升的杯子一個,5升的杯子一個,杯子的形狀不規則,問怎麼才能得到4升的水,水無限多.(請寫出推理過程)

解:先將5升的杯子倒滿,然後把5升的杯子中的水倒入3升的杯子,倒滿後5升的杯子剩下2升.再把3升杯子中的水倒掉,把5升的杯子中剩餘的2升水倒入3升的杯子中,然後把5升的杯子倒滿.再用5升的杯子中的水給3升的杯子添滿,則5升的杯子中剩餘4升的水.

117.數據持久化存儲方案有哪些?

解:所謂的持久化,就是將數據保存到硬盤中,使得在應用程序或機器重啓後可以繼續訪問之前保存的數據。在iOS開發中,數據持久化的方案有5種方案:

plist文件(屬性列表)

preference(偏好設置)

NSKeyedArchiver(歸檔)

SQLite 3

CoreData

118.網絡通信用過哪些方式?

解: ios設備的網絡通信的方法,有如下兩個大類:

1、使用socket的方式進行通信。

2、使用asynsocket類庫進行通信。

119.如何處理多個網絡請求併發的情況?

解: //瞭解(併發)當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式我們稱之爲併發(Concurrent)。

遇到這種情況建議使用第三方的網絡庫。比如AFNetworking。也可以通過GCD和NSOperationQueue來控制併發

120.簡單介紹一下KVC和KVO,他們都可以應用在哪些場景?

解: KVO:鍵值監聽,觀察某一屬性的方法

KVC:鍵值編碼,是一種間接訪問對象的屬性

121.講述一下runtime的概念,message

send如果尋找不到響應的對象,會如何?

Objc Runtime其實是一個Runtime庫,它基本上是用C和彙編寫的,這個庫使得C語言有了面向對象的能力。

122. iOS能否嵌入其他語言?如何實現?

不會!!!!!

123. iOS移動開發最終生成的是什麼文件?其結構如何?

最後打包完成是一個.ipa文件可以通過iTunes和其他工具對有測試資格的手機進行安裝

124. UINavigationController如何要使用push/pop功能的話,需要怎麼實現

1.用UINavigationController的時候用pushViewController:animated

----返回之前的視圖[[selfnavigationController] popViewControllerAnimated:YES];

---ps:push以後會在navigation的left bar自動添加back按鈕,它的響應方法就是返回。所以一般不需要寫返回方法,點back按鈕即可。

2.其他時候用presentModalViewController:animated

[selfpresentModalViewController:controller animated:YES];//YES有動畫效果

-----返回之前的視圖[selfdismissModalViewControllerAnimated:YES];

3.切換視圖一般用不到addSubview

UINavigationController是導航控制器,如果pushViewController的話,會跳轉到下一個ViewController,點返回會回到現在這個ViewController;

如果是addSubview的話,其實還是對當前的ViewController操作,只是在當前視圖上面又“蓋”住了一層視圖,其實原來的畫面在下面呢,看不到而已。

125. UIView如何需要重新繪製整個界面,需要調用什麼方法?

UIView setNeedsDisplay和setNeedsLayout方法。首先兩個方法都是異步執行的。而setNeedsDisplay會調用自動調用drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext,就可以畫畫了。而setNeedsLayout會默認調用layoutSubViews,就可以處理子視圖中的一些數據。

綜上所述:setNeedsDisplay方便繪圖,而layoutSubViews方便出來數據

setNeedDisplay告知視圖它發生了改變,需要重新繪製自身,就相當於刷新界面.

126. Plist文件?結構是?

Plist文件通常用於儲存用戶設置,也可以用於存儲捆綁的信息,該功能在舊式的Mac OS中是由資源分支提供的。

Plist主要有Core Fundation類型構成,也可以將這些類型放入NSDictionary和NSArray以便後塍更復雜的數據類型

127. iOS裏面的二進制數據類型是什麼?和NSString如何互相轉換?

NSData:用於存儲二進制的數據類型

NSData類提供了一種簡單的方式,它用來設置緩衝區、將文件的內容讀入緩衝區,或將緩衝區的內容寫到一個文件。

不變緩衝區(NSData類),也可定義可變的緩衝區(NSMutableData類)。

NSData、NSString互轉:

NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];

//NSString轉換成NSData類型

NSString * newStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

128. iOS裏面是否有GBK的字符編碼描述?即NSUTF8StringEncoding如果有,是怎樣的?

不會

129. iOS裏面的手勢是如何實現的?

130.談談你瞭解的設計模式,你用過哪些,他們的缺點

1.MVC:優點:

1、開發人員可以只關注整個結構中的其中某一層;

2、可以很容易的用新的實現來替換原有層次的實現;

3、可以降低層與層之間的依賴;

4、有利於標準化;

5、利於各層邏輯的複用。

缺點:

1、降低了系統的性能。這是不言而喻的。如果不採用分層式結構,很多業務可以直接造訪數據庫,以此獲取相應的數據,如今卻必須通過中間層來完成。

2、有時會導致級聯的修改。這種修改尤其體現在自上而下的方向。如果在表示層中需要增加一個功能,爲保證其設計符合分層式結構,可能需要在相應的業務邏輯層和數據訪問層中都增加相應的代碼。

2.觀察者模式優點:

1、觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的接口。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。

由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個對象必然跨越抽象化和具體化層次。

2、觀察者模式支持廣播通訊。被觀察者會向所有的登記過的觀察者發出通知,

觀察者模式缺點:

1、如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

2、如果在被觀察者之間有循環依賴的話,被觀察者會觸發它們之間進行循環調用,導致系統崩潰。在使用觀察者模式是要特別注意這一點。

3、如果對觀察者的通知是通過另外的線程進行異步投遞的話,系統必須保證投遞是以自恰的方式進行的。

4、雖然觀察者模式可以隨時使觀察者知道所觀察的對象發生了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的對象是怎麼發生變化的。

3.單例模式:主要優點:

1、提供了對唯一實例的受控訪問。

2、由於在系統內存中只存在一個對象,因此可以節約系統資源,對於一些需要頻繁創建和銷燬的對象單例模式無疑可以提高系統的性能。

3、允許可變數目的實例。

3.單例模式:主要缺點:

1、由於單利模式中沒有抽象層,因此單例類的擴展有很大的困難。

2、單例類的職責過重,在一定程度上違背了“單一職責原則”。

3、濫用單例將帶來一些負面問題,如爲了節省資源將數據庫連接池對象設計爲的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認爲是垃圾而被回收,這將導致對象狀態的丟失.

131.數據持久化存儲方案有哪些?

答:

(附網址:http://www.cocoachina.com/industry/20130328/5908.html)

iOS中的數據持久化方式,基本上有以下四種:屬性列表、對象歸檔、SQLite3和Core Data

1.屬性列表(NSUserDefaults,用於存儲配置信息)

涉及到的主要類:NSUserDefaults,一般[NSUserDefaults standardUserDefaults]就夠用了

2.對象歸檔

要使用對象歸檔,對象必須實現NSCoding協議.大部分Object C對象都符合NSCoding協議,也可以在自定義對象中實現NSCoding協議,要實現NSCoding協議,實現兩個方法

3.SQLite3

SQLite的數據庫權限只依賴於文件系統,沒有用戶帳戶的概念。SQLite有數據庫級鎖定,沒有網絡服務器。它需要的內存,其它開銷很小,適合用於嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。

4.Core Data

Core Data本質上是使用SQLite保存數據,但是它不需要編寫任何SQL語句。

要使用Core Data,需要在Xcode中的數據模型編輯器中設計好各個實體以及定義好他們的屬性和關係。之後,通過操作這些對象,結合Core Data完成數據的持久化:

132.網絡通信用過哪些方式?

(附網址:http://blog.csdn.net/chang6520/article/details/7967698)

同樣也是代碼解釋

iOS設備的網絡通信的方法,有如下兩個大類:

1、使用socket的方式進行通信。

以TCP爲利,對於TCP來說,是要區分服務端和客戶端的。服務端:通常的方法是服務端啓動後監聽,是否有客戶端連接,如果有連接,則建立與客戶端的通信。客戶端的方法通常是連接服務端,當連接成功之後,就希望發送數據了。

2、使用asynsocket類庫進行通信。

133.如何處理多個網絡請求併發的情況?

答:

(附網址:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html)

答案都是代碼,大家可以打開網址仔細閱讀

1.併發當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式我們稱之爲併發(Concurrent)。

2.並行當系統有一個以上CPU時,則線程的操作有可能非併發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶佔CPU資源,可以同時進行,這種方式我們稱之爲並行(Parallel)。

3.區別併發和並行是即相似又有區別的兩個概念,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。

134.簡單介紹一下KVC和KVO,他們都可以應用在哪些場景?

答:

(附網址:http://blog.csdn.net/zhaozy55555/article/details/8598374

http://www.cnblogs.com/kenshincui/p/3871178.html)

KVC:NSKeyValueCoding的簡稱,是一種可以直接通過字符串的名字(key)來訪問類屬性的機制,而不是通過調用的Setter、Getter方法訪問。

KVC的操作方法由NSKeyValueCoding協議提供,NSObject就實現了這個協議,也就是說如果對象是NSObject的子對象那麼就支持KVC操作,KVC有兩種操作方法,一種是設值,一種是取值,可以理解爲getter和setter,不過稍微有所不同的是,設置對象值的方法中有兩個,setValue:屬性值forKey:屬性名(一般的設置,比如說是說設置NSString,NSNumber等基本類類型,setetValue:屬性值forKeyPath:屬性路徑

2.KVO:NSKeyValueObserving的簡稱,當指定的對象的屬性被修改了,允許對象接受到通知的機制。每次指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應的觀察者,相當於設計模式中的觀察者模式。

Key-Value Observing (KVO)建立在KVC之上,能夠觀察一個對象的KVC key path值的變化,接下來的做的實例是在iOS中視圖的ViewDidLoad中實現的,跟KVC類似,不過可以監聽值的變化,實現起來很簡單addObserver添加觀察,observeValueForKeyPath觀察變化之後的事件,最後需要銷燬以下監聽事件,

135.實現多線程有哪些方法,分別有什麼區別?

答: (http://www.cnblogs.com/hanjun/p/3667874.html)

1.NSThread

2.NSOperationQueue

3.GCD

區別:

Thread是這三種範式裏面相對輕量級的,但也是使用起來最負責的,你需要自己管理thread的生命週期,線程之間的同步。線程共享同一應用程序的部分內存空間,它們擁有對數據相同的訪問權限。你得協調多個線程對同一數據的訪問,一般做法是在訪問之前加鎖,這會導致一定的性能開銷。在iOS中我們可以使用多種形式的thread:

Cocoa threads:使用NSThread或直接從NSObject的類方法performSelectorInBackground:withObject:來創建一個線程。如果你選擇thread來實現多線程,那麼NSThread就是官方推薦優先選用的方式。

Cocoa operations是基於Obective-C實現的,類NSOperation以面向對象的方式封裝了用戶需要執行的操作,我們只要聚焦於我們需要做的事情,而不必太操心線程的管理,同步等事情,因爲NSOperation已經爲我們封裝了這些事情。NSOperation是一個抽象基類,我們必須使用它的子類。iOS提供了兩種默認實現:NSInvocationOperation和NSBlockOperation。

Grand Central Dispatch (GCD): iOS4纔開始支持,它提供了一些新的特性,以及運行庫來支持多核並行編程,它的關注點更高:如何在多個cpu上提升效率。

136.The ios/osx’s graphics is bassed onOpenGL . what is OpenGL?

iOS的/ OS X的圖形是基於OpenGL。什麼是OpenGL?

(附網址:https://developer.apple.com/opengl/)

官方的解釋:OpenGL是硬件基礎圖形加速在OS X的權力核心動畫,核心形象,和石英的極端和給你的應用程序訪問驚人的3D圖形處理能力。使用工業標準的圖形API創建一系列應用程序,包括遊戲,動畫製作軟件,以及醫療成像解決方案。

百度的解釋:

OpenGL:(Open Graphics Library)是指定義了一個跨編程語言、跨平臺的編程接口規格的專業的圖形程序接口。它用於三維圖像(二維的亦可),是一個功能強大,調用方便的底層圖形庫。計算機三維圖形是指將用數據描述的三維空間通過計算轉換成二維圖像並顯示或打印出來的技術。OpenGL就是支持這種轉換的程序庫,它源於SGI公司爲其圖形工作站開發的IRIS GL,在跨平臺移植過程中發展成爲OpenGL。OpenGL被設計成獨立於硬件、獨立於窗口系統,在各種操作系統的計算機上都可用的,並能在網絡環境下以客戶/服務器模式工作,是專業圖形處理、科學計算等高端應用領域的標準圖形庫

137.What is CoreFoundation framework,andwhat is Foundation frame-work

什麼是框架的CoreFoundation,什麼是Foundation框架

答:

(附:文頂頂網址http://www.cnblogs.com/wendingding/p/3710820.htmlhttp://blog.csdn.net/annkey123/article/details/8271867)

Core Foundation框架(CoreFoundation.framework)是一組C語言接口,它們爲iOS應用程序提供基本數據管理和服務功能。

Foundation—基礎框架。框架中包含了很多開發中常用的數據類型,如結構體,枚舉,類等,是其他ios框架的基礎。

如果要想使用foundation框架中的數據類型,那麼包含它的主頭文件就可以了。

即#import

補充:core foundation框架相對底層,裏面的代碼幾乎都是c語言的,而foundation中是OC的。

138.How do you save data for you app

你如何保存你的應用程序數據

答:

(附網址:應用數據存儲方式

(XML屬性列表-plist): http://www.cnblogs.com/ wendingding/p/3773867.html

(偏好設置):http://www.cnblogs.com/wendingding/p/3775178.html

(歸檔):http://www.cnblogs.com/wendingding/p/3775293.html)

ios應用數據存儲方式(XML屬性列表-plist)ios應用常用的數據存儲方式

1.plist(XML屬性列表歸檔)

2.偏好設置

3.NSKeydeArchiver歸檔(存儲自定義對象)

4.SQLite3(數據庫,關係型數據庫,不能直接存儲對象,要編寫一些數據庫的語句,將對象拆開存儲)

5.Core Data(對象型的數據庫,把內部環節屏蔽)

139.Do you use GIT version control?What isthe difference between merge and rebase ? If you are not using GIT ,are youusing any distributed version control system?

您是否使用Git版本控制?什麼是合併和重訂之間的區別?如果你沒有使用Git,您使用的分佈式版本控制系統?

答:建議大家使用百度翻譯打開網址以下均是英文解釋

(附網址:什麼是版本控制:https://git-scm.com/book/zh/ch1-1.html

國外網友的解釋:http://translate.baiducontent.com/transpage?query=http%3A%2F%2Fserve.3ezy.com%2Fstackoverflow.com%2Fquestions%2F16666089%2Fwhats-the-difference-between-git-merge-and-git-rebase&from=en&to=zh&source=url

合訂和重定的解釋:http://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=http%3A%2F%2Fserve.3ezy.com%2Fgit-scm.com%2Fbook%2Fen%2FGit-Branching-Rebasing&from=en&to=zh&token=&monLang=zh

視頻的網址:http://www.git-tower.com/learn/git/videos/)

140.Storyboard or Xib, which do youprefer?And why

Storyboard和Xib你喜歡哪個爲什麼?

答:

(附網址:http://blog.mobilejazz.com/storyboards-xibs-best-practices/)

喜歡哪個大家可以選擇:以下是Storyboard和Xib的優缺點可以參考以下

以下解釋是英文翻譯過來的(建議大家可以看網址原文章)

xibs是XML文件定義和配置的一組對象,並專門操縱主要觀點(UIView子類)。Xcode具有友好的編輯器,可以顯示這些意見,它是一個運行的應用程序,使得它的配置和設計佈局非常容易(節省很多行代碼)。

即使大多數開發商關聯一個xib文件“屏幕”或“視圖控制器”,是通用的容器xibs對象和可以一起使用,與其它類型的對象作爲nsobjectsUIViews,或者只是一個人。

Storyboard

這是一個XML文件代表統一一套xibs爲了定義導航之間的一組視圖控制器。有一個故事一個開發者可以定義多個“屏幕”(或和導航之間的UIViewController類)他們。

作爲一個差的XIB,故事是由定義的視圖和導航處理他們之間。

xibs VS代碼的好處

視圖的可視化配置。

自動佈局的視覺形態。

大小班的視覺形態。

節省時間和代碼,而“創建實例”。

節省時間和代碼,而“配置對象”。

快速UITableViewCell原型。

快速配置控制動作(ibactions)。

Storyboard與xibs效益

可以直接在腳本本身原型的行

可以定義靜態表格部分和行。

可以使用自動佈局約束添加到toplayoutguidebottomlayoutguide。

可以指定導航和過渡(這是一個主要的目的!)。

可以定義多個“屏幕”(處理的)在一個地方(不需要多xibs)。

對xibs VS代碼不便

容易破裂合併時(GIT)。

不復雜的自動佈局定義。

不能引用(或包括)其他xibs。

Storyboard與代碼xibs不便

故事情節是:大文件的加載速度慢,有時。

需要一個大屏幕顯示所有(或部分)的內容。

容易破裂合併時(GIT)。

高概率打破它時,合併(GIT)作爲故事包含很多信息。

許多警告當支持iOS 7和iOS 8(利潤,大小班)。

不能引用(或包括)其他xibs。

151. Aside from regular tasks like

reading/writing element, getting the count of an array, can you write something

else you can do to an NSArray with only the built-in SDK? E.g, how do you

filter(過濾器), map, an NSArray?

不會

152.Do you use SDWebImage? If yes, why doyou choose this library? If no, how do you load an image from Internet to anUIImageView?

翻譯:你使用SDWebImage嗎?如果使用,你爲什麼使用這個庫,如果不使用,你是怎樣加載一張網絡圖片的?

答案:這個類庫提供一個UIImageView類別以支持加載來自網絡的遠程圖片。具有緩存管理、異步下載、同一個URL下載次數控制和優化等特徵。

156.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢?爲什麼

NSMutableArray* ary = [[NSMutableArrayarray] retain]; //2

NSString *str = [NSStringstringWithFormat:@"test"];//1

[str retain];// 2

[ary addObject:str]; // 3

NSLog(@"%d", [str retainCount]);

[str retain];// 4

[str release];// 3

[str release];// 2

NSLog(@"%d", [str retainCount]);//2

[ary removeAllObjects]; // 1

NSLog(@"%d", [strretainCount]);

結果:3、2、1

157.Storyboard or Xib, which do you

prefer?And why?

你喜歡使用Storyboard還是Xib?爲什麼?

詳細解釋:“http://stackoverflow.com/questions/13834999/storyboards-vs-the-old-xib-way”

答案: The reasons for liking Storyboard:There are things you can do with

a storyboard that you can't do with a nib. A storyboard lets you create segues

between view controllers, and it lets you design table view cells in-place. One

big advantage of Storyboard is the ability to view your entire application's

GUI(圖形用戶界面)flow. Zoom out and you can see how everything interconnects andflows.

The reasons for liking Xib : There are

things you can do with a nib that you can't do with a storyboard. In a nib, you

can create references to the File's Owner placeholder(佔位符). You

can create multiple top-level views, edit them, and create connections between

them. See this answer for an example of why you'd want to do that. You can add

external(外部的)object placeholders (a rarely-used feature很少使用的功能).

1.Apartfrom the historical value in the xib approach, xib's also provide modularity.Perhaps you have a library of code or wish to share a useful widget you made.Taking the xib approach would facilitate that sharing and reuse.

2.Thexib approach also allows you some greater flexibility in terms of your owncode.

3.Withxibs, while the modularity is nice, it's tougher to envision how everythingconnects and flows together. This can be a useful feature for yourself, or ifyou have a larger team to share with, to allow others to see how the app flows.

158. if you’ve started using Swift,writedown one or two features that is presenting Swift which is not Objective-C, andhow it helps you

英語翻譯:如果你已經使用了Swift,寫出一個或兩個Swift有而OC沒有的功能,它是怎樣幫助你的?

答案:可選類型(optionals)、元組(tuples)、泛型(generics),類型推斷(type inference)以及其他等等。(答案不全)

159. How do you do abackground task(後臺任務)in iOS,indifferent ways ? And which one doyou prefer

翻譯:你怎樣用一種不同的方式做一個後臺任務,你喜歡哪一種方式?

答案:http://www.2cto.com/kf/201402/278626.html

160.static關鍵字的作用?

在C語言中,關鍵字static有三個明顯的作用:

1).在函數體,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變。

2).在模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

3).在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。

161.堆和棧的區別?

堆和棧的區別:

一、堆棧空間分配區別:

1、棧(操作系統):由操作系統自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧;

2、堆(操作系統):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。

二、堆棧緩存方式區別:

1、棧使用的是一級緩存,他們通常都是被調用時處於存儲空間中,調用完畢立即釋放;

2、堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並不是一旦成爲孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。

三、堆棧數據結構區別:

堆(數據結構):堆可以被看成是一棵樹,如:堆排序;

棧(數據結構):一種先進後出的數據結構。

162.目標~動作機制

目標是動作消息的接收者。一個控件,或者更爲常見的是它的單元,以插座變量(參見"插座變量"部分)

的形式保有其動作消息的目標。

動作是控件發送給目標的消息,或者從目標的角度看,它是目標爲了響應動作而實現的方法。

程序需要某些機制來進行事件和指令的翻譯。這個機制就是目標-動作機制

163.自動釋放池是什麼,如何工作?

一、什麼是自動釋放池

1、Autorelease pool

自動釋放池(Autorelease pool)是OC的一種內存自動回收機制,可以將一些臨時變量通過自動釋放池來回收統一釋放

自動釋放池本事銷燬的時候,池子裏面所有的對象都會做一次release操作

2、autorelease

任何OC對象只要調用autorelease方法,就會把該對象放到離自己最近的自動釋放池中(棧頂的釋放池)。

二:O-C當中的內存釋放,並不是像java/.net那樣有一個自動的釋放池,開發人員不用去關心有關內存釋放的問題,O-C裏面的自動釋放池比c語言的手動內存管理要好一些,但是相對於java/.net來說又弱一些,所以說O-C當中的釋放屬於半自動的釋放池。

三、如何創建一個自動釋放池

//ios5.0新方式

@autoreleasepool

{

}

//ios5.0之前的老方式

NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];

[pool release];

四、自動釋放池如何釋放對象內存

黃金法則:如果對一個對象使用了alloc,[mutable]copy,retain,那麼必須使用相應的release或者autorelease.

164.obj-c的優點

objc優點:

1) Cateogies

2) Posing

3)動態識別

4)指標計算

5)彈性訊息傳遞

6)不是一個過度複雜的C衍生語言

7) Objective-C與C++可混合編程

缺點:

1)不支援命名空間

2)不支持運算符重載

3)不支持多重繼承

4)使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。

OC沒有多重繼承,Java也沒有C++纔有

OC使用協議來實現多重繼承

165.什麼時候用delegate,什麼時候用Notification

1.參數的不同

使用delegate參數更加直觀,使用notification參數不那麼直觀,所以能使用delegate的地方,儘量使用delegate

2.傳遞的長度

有時候你的頁面會一次跳好幾個頁面,那麼你想把這個頁面的數據傳回到底層是很麻煩的事情,因爲你要把delegate指針從底層界面一直傳上來。

3.傳遞多個數據

當你在同一個對象傳遞給多個對象,用delegate就不可行了。

166.什麼是KVC和KVO?

1、KVC,即是指NSKeyValueCoding,一個非正式的Protocol,提供一種機制來間接訪問對象的屬性。而不是通過調用Setter、Getter方法訪問。KVO就是基於KVC實現的關鍵技術之一。

2、KVO的是KeyValue

Observe的縮寫,中文是鍵值觀察。這是一個典型的觀察者模式,觀察者在鍵值改變時會得到通知。iOS中有個Notification的機制,也可以獲得通知,但這個機制需要有個Center,相比之下KVO更加簡潔而直接。

167.類別的作用

作用:

1對系統的類或自己定義的類的擴充(只是指,不能聲明屬性Instance variable)e.g. base64 MD5.但是不能保證所有的方法都能被調用。尤其是在指定一個與系統的方法相同的方法時一定要注意。

文件名:NSString+additions.h

NSString+additions.m

@interface NSString (Base64)

2可以聲明私有方法。

ZYViewController.m

@interfaceZYViewController (additions)

//{

//BOOL isOK;

//}

- (void)ok;

@property

@end

3可以聲明分散類的方法(NSIndexPath)

分散類體現出類別不僅可以擴充系統的方法,而且可以擴充自己定義的類。

由第3個作用可知:不管是否使用的分散類在任何的.h文件中,我只考慮類別中的方法包裹在@interface className ..@end,那麼我只明確將來類別中的方法就屬於className這個類。

168.淺複製和深複製的區別

簡單的來說就是,在有指針的情況下,淺拷貝只是增加了一個指針指向已經存在的內存,而深拷貝就是增加一個指針並且申請一個新的內存,使這個增加的指針指向這個新的內存,採用深拷貝的情況下,釋放內存的時候就不會出現在淺拷貝時重複釋放同一內存的錯誤!

我列舉一個例子來說吧:

你正在編寫C++程序中有時用到,操作符的重載。最能體現深層拷貝與淺層拷貝的,就是‘=’的重載。

看下面一個簡單的程序:

class string{

char *m_str;

public:

string(char *s){

m_str=s;

}

string()

{};

String & operator=(const string s){

m_str=s.m_str;

return *this

}

};

int main(){

string s1("abc"),s2;

s2=s1;

cout<

上面的=重載其是就是實現了淺拷貝原因。是由於對象之中含有指針數據類型.s1,s2恰好指向同一各內存。所以是淺拷貝。而你如果修改一下原來的程序:

string&operator=(const string&s){

if(strlen(m_str)!=strlen(s.m_str))

m_str=new char[strlen(s.m_str)+1];

if(*this!=s)

strcopy(m_str,s.m_str);

return *this;

}

這樣你就實現了深拷貝,原因是你爲被賦值對象申請了一個新的內存所以就是深拷貝。

169.代理的作用

代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架複雜度。

另外一點,代理可以理解爲java中的回調監聽機制的一種類似。

170.我們說的OC是動態運行時語言是什麼意思?

多態。

主要是將數據類型的確定由編譯時,推遲到了運行時。

這個問題其實淺涉及到兩個概念,運行時和多態。

簡單來說,運行時機制使我們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。

意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。

也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。

因此也可以說,運行時機制是多態的基礎。

171.什麼是ARC?請簡述一下ARC的原理。

1)ARC是iOS 5推出的新功能,全稱叫ARC(Automatic Reference Counting)。簡單地說,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了

2)、ARC的規則就是隻要對象沒有強指針引用,就會被釋放掉,換而言之只要還有一個強引用指針變量指向對象,那麼這個對象就會存在內存中。弱指針指向的對象,會被自動變成空指針(nil指針),從而不會引發野指針錯誤。

172.簡述視圖控制器的生命週期。

1)、init函數(init;initWithFrame;initWithCoder;等)--初始化

2)、awakeFromNib--在loadView之前的工作放在這裏

3)、viewDidLoad--注意,一個ViewController一個生命週期內這個函數只會調用一次

4)、viewWillAppear--view將要出現,每次View消失再出現都會調用

5)、viewWillLayoutSubviews--簡要對子試圖進行佈局

6)、viewDidLayoutSubivews--完成對子試圖佈局

7)、viewDidAppear--視圖將要出現在屏幕上

---上述代碼不含部分

8)、viewWillDisappear--View將要消失

9)viewDidDisappear--View已經消失

173.請描述一下線程的生命週期。

新建(new Thread)、就緒(runnable)、運行(running)、死亡(dead)、堵塞(blocked)

174.請至少列舉5個常用的設計模式。

1)、代理模式2)、觀察者模式3)、MVC模式4)、單例模式5)工廠模式

175.如何增強iOS應用程序的性能。

初級

1、使用ARC進行內存管理、2.在適當的情況下使用reuseIdentifier

3.儘可能將View設置爲不透明(Opaque)4.避免臃腫的XIBs 5.不要阻塞主線程6.讓圖片的大小跟UIImageView一樣7.選擇正確的集合8.使用GZIP壓縮

中級:

9.重用和延遲加載View 10.緩存、緩存、緩存11.考慮繪製12.處理內存警告13.重用花銷很大的對象14.使用Sprite

Sheets 15.避免重新處理數據16.選擇正確的數據格式17.設置適當的背景圖片18.降低Web內容的影響19.設置陰影路徑20.優化TableView 21.選擇正確的數據存儲方式

高級

22.加速啓動時間23.使用Autorelease

Pool 24.緩存圖片—或者不緩存25.儘量避免Date格式化

176.請列舉至少五個iOS中常用的第三方類庫。

1).AFNetworking

2). SDWebImage

3). shareKit

4). FMDatebase

5). MMDrawerController

177.隊列和棧有什麼區別。

棧(Stack):是限定只能在表的一端進行插入和刪除操作的線性表

隊列(Queue)是限定只能在表的一段進行插入和在另一端進行刪除操作的的線性表

1)、隊列是先進先出,棧是先進後出

2)、遍歷數據速度不同,隊列遍歷速度要快得多

178.常用的XML文件的解析方式有哪些?它們各自的區別是什麼?

1)、有兩種解析方式:DOM解析與SAX解析

2)、DOM解析必須先完成DOM樹的創建,在處理規模較大XML文檔時就很耗內存,佔用資源較多

3)與DOM不同,SAX是用事件驅動模型,解析XML時每遇到一個開始或結束標籤、或者屬性、或者一條指令時,程序就會產生一個事件進行相應的處理,因此,SAX相對於DOM來說更適合操作較大的XML文檔

179.請介紹幾個常用的git命令。

git branch查看本地所有分支、git status查看當前狀態、git commit提交、git branch -a查看所有的分支、git

branch -r查看本地所有分支

180.請簡單描述一下自己的職業生涯規劃。

不知道

181.static關鍵字的作用

答案:

(1)設置變量的存儲域,函數體內static變量的作用範圍爲該函數體,不同於auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;

(2)限制變量的作用域,在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;

(3)限制函數的作用域,在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明它的模塊內;

(4)在類中的static成員變量意味着它爲該類的所有實例所共享,也就是說當某個類的實例修改了該靜態成員變量,其修改值爲該類的其它所有實例所見;

(5)在類中的static成員函數屬於整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員變量。

182.堆和棧的區別?

答:答:棧完全是由系統管理的,堆是由程序員自己控制管理的,包括內存空間的開闢和釋放.棧是先進後出.

183.目標-動作機制?

答:目標是動作消息的接收者。一個控件,或者更爲常見的是它的單元,以插座變量(參見"插座變量"部分)

的形式保有其動作消息的目標。

動作是控件發送給目標的消息,或者從目標的角度看,它是目標爲了響應動作而實現的方法。

程序需要某些機制來進行事件和指令的翻譯。這個機制就是目標-動作機制

184.自動釋放池是什麼,如合工作?

答:當向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。

185. obj-c的優缺點

答: objc優點:

1) Cateogies

2) Posing

3)動態識別

4)指標計算

5)彈性訊息傳遞

6)不是一個過度複雜的C衍生語言

7) Objective-C與C++可混合編程

缺點:

1)不支援命名空間

2)不支持運算符重載

3)不支持多重繼承

4)使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。

OC沒有多重繼承,Java也沒有C++纔有

OC使用協議來實現多重繼承

186.什麼時候用delegate,什麼時候用Notification?

答: Delegate

消息的發送者(sender)告知接受者(receiver)某個事件將要發生, delegate同意後發送者響應事件,delegate機制使得接受者可以改變發送者的行爲.

1/傳值

b把自己的數據和對象傳給a,讓a去展示或處理

2/傳事件

delegate的優勢:

1.非常嚴格的語法。所有將聽到的事件必須是在delegate協議中有清晰的定義。

2.如果delegate中的一個方法沒有實現那麼就會出現編譯警告/錯誤

3.協議必須在controller的作用域範圍內定義

4.在一個應用中的控制流程是可跟蹤的並且是可識別的;

5.在一個控制器中可以定義定義多個不同的協議,每個協議有不同的delegates

6.沒有第三方對象要求保持/監視通信過程。

7.能夠接收調用的協議方法的返回值。這意味着delegate能夠提供反饋信息給controller

Notification

消息的發送者告知接受者事件已經發生或者將要發送(接受者不能影響發送者的行爲)

消息接受者通過keyPath的方式指定需要接受的消息類型,通常在對象初始化完成之後聲明開始接收消息在對象被銷燬前註銷接收消息.

notification優勢:

1.不需要編寫多少代碼,實現比較簡單;

2.對於一個發出的通知,多個對象能夠做出反應,即1對多的方式實現簡單

Delegate和Notification區別

1/二者都用於傳遞消息.

delegate針對one - to - one關係receiver可以返回值給sender.

notification用於one - to - one /

many / none關係receiver無法返回值給sender.

2/delegate兩者之間必須建立聯繫否則沒辦法調用代理方法.

notification不需要兩者之間有聯繫.

3/delegate用於希望sender接受到receiver的某個功能值反饋

notification用於通知多個object某個事件

4/notification通過維護一個array,實現一對多消息的轉發

187.什麼是KVC和KVO?

答: Key value coding,Key value observer.

Kvc是路徑訪問的規範,kvo是觀察某個變量的變化過程

KVO可以觀察某個對象的變量變化過程,KVC是滿足被觀察的編

碼規範。

KVC/KVO類似於代理,通知中心。都是一種通訊方法。

188.類別的作用?

答:類別主要有3個作用:

(1)將類的實現分散到多個不同文件或多個不同框架中。

(2)創建對私有方法的前向引用。

(3)向對象添加非正式協議

189.淺複製和深複製的區別?

答:簡單的來說就是,在有指針的情況下,淺拷貝只是增加了一個指針指向已經存在的內存,而深拷貝就是增加一個指針並且申請一個新的內存,使這個增加的指針指向這個新的內存,採用深拷貝的情況下,釋放內存的時候就不會出現在淺拷貝時重複釋放同一內存的錯誤!

190.代理的作用?

答:作用有兩個,一個是傳值,一個是傳事件

191.我們說的OC是動態運行時語言是什麼意思?

多態。

答:主要是將數據類型的確定由編譯時,推遲到了運行時。

這個問題其實淺涉及到兩個概念,運行時和多態。

簡單來說,運行時機制使我們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。

意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。

也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。

因此也可以說,運行時機制是多態的基礎。

198.Object–C的類可以多重繼承嗎?可以實現多個接口嗎?

Category是什麼?重寫一個類的方法用繼承好還是分類好?爲什麼?

答案:Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

199..屬性readwrite , readonly , assign , retain , copy , nonatomic ,各是什麼作用,在哪種情況下用?

答:

assign用於簡單數據類型,如NSInteger,double,bool,

retain和copy用於對象,

readwrite是可讀可寫特性;需要生成getter方法和setter方法時

readonly是隻讀特性只會生成getter方法不會生成setter方法;不希望屬性在類外改變

assign是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

retain表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy表示賦值特性,setter方法將傳入對象複製一份;需要一份新的變量時。

nonatomic非原子操作,atomic原子性操作。原子性指的是一個操作不可以被中途cpu暫停然後調度,即不能被中斷,要不就執行完,要不就不執行,就是爲了多線程安全的。

一般使用nonatomic。

201.內存管理的幾條原則是什麼?按照默認法則,哪些關鍵字生成的對象需要手動釋放,在和property結合的時候怎樣有效的避免內存泄露?

答:當使用new、alloc或copy方法創建一個對象時,該對象引用計數器爲1。如果不需要使用該對象,可以向其發送release或autorelease消息,在其使用完畢時被銷燬。

如果通過其他方法獲取一個對象,則可以假設這個對象引用計數爲1,並且被設置爲autorelease,不需要對該對象進行清理,如果確實需要retain這個對象,則需要使用完畢後release。

如果retain了某個對象,需要release或autorelease該對象,保持retain方法和release方法使用次數相等。

使用new、alloc、copy關鍵字生成的對象和retain了的對象需要手動釋放。設置爲autorelease的對象不需要手動釋放,會直接進入自動釋放池。

202.堆和棧什麼區別?

答:一、堆棧空間分配區別:

1、棧(操作系統):由操作系統自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧;

2、堆(操作系統):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。

二、堆棧緩存方式區別:

1、棧使用的是一級緩存,他們通常都是被調用時處於存儲空間中,調用完畢立即釋放;

2、堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並不是一旦成爲孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。

三、堆棧數據結構區別:

堆(數據結構):堆可以被看成是一棵樹,如:堆排序;

棧(數據結構):一種先進後出的數據結構。

203.描述一下iOS SDK中如何實現MVC設計模式?

答:

MVC是模型、試圖、控制開發模式,對於iOS

SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型數據。

204.iOS數據持久化方式有哪些?

205和199一樣刪除205

206.自動釋放池是什麼,如何工作?

答:當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。

207. if you can Android/Windows Phone,write something about the comparison between it and iOS

翻譯如果你有Android /

Windows Phone的手機,寫一些關於它與iOS設備之間的比較

答案:自己發揮

208. Write something about the differencesbetween Objective-C and C++.

翻譯寫一些關於Objective-C和C++之間的差異

答案:

1、Objective C基本上是在C +

Smalltalk基礎上衍生出來的,C++就是C++。除了都是從C語言分化出來的以外,完全沒有任何共性。

2、最大的區別就是Objective C的成員函數調用是基於動態綁定的,類本身並沒有限制對象可以有什麼函數。相對於C++類會規定好成員有什麼函數。這使得Objective C的靈活性很大,但是執行效率也很低。

3、在NeXT系統的時代C++和Objective C都不是那麼大衆的東西,C++也還沒完善,而且那個時代編譯器的有優化能力也沒現在那麼變態。所以選擇Objective C也不是很奇怪的事。但是現在Objective C的劣勢就越來越明顯了,所以蘋果開發了Swift,而且就內部消息蘋果很可能會準備放棄OC。

209. __unsafe_unretained vs__weak; purposeof __block; NSString const * vs NSString *const

unsafe_unretained往往都是用來聲明屬性的,如果想聲明臨時變量就得用__strong,__weak,__unsafe_unretained,__autoreleasing;

block閉包就是能夠讀取其它函數內部變量的函數;

NSString const *HSCoder = @"漢斯哈哈哈";

"*HSCoder"不能被修改,"HSCoder"能被修改

NSString * const HSCoder = @"漢斯哈哈哈";

"HSCoder"不能被修改,"*HSCoder"能被修改

210. Write something about what you achievedby and what you learned from the UITableView class

首先,Controller需要實現兩個delegate,分別是UITableViewDelegate和UITableViewDataSource然後UITableView對象的delegate要設置爲self,註冊cell,之後給定分區數和行數,注意cell的重用機制,可以設置系統cell或者自定義cell

211.你對天健公司有哪些瞭解?你爲什麼願意成爲天健公司的一員?

212. Object C中創建線程的方法是什麼?如果在主線程中執行代碼,方法是什麼?如果想延時執行代碼,方法又是什麼?

線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然後將其加入NSOperationQueue;

在主線程執行代碼,方法是performSelectorOnMainThread,

如果想延時執行代碼可以用performSelector:onThread:withObject: afterDelay:或者使用GCD的函數:dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

// 2秒後異步執行這裏的代碼...

});

213.描述一下iOS SDK中如何實現MVC的開發模式

MVC是模型、視圖、控制器開發模式,對於iOS

SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖器來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是視圖器,由它負責控制視圖,訪問模型數據。

214.簡述淺拷貝和深拷貝

答案:淺層複製:只複製指向對象的指針,而不復制引用對象本身。

深層複製:複製引用對象本身。

意思就是說我有個A對象,複製一份後得到A_copy對象後,對於淺複製來說,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象本身資源

還是隻有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改,這其實違背了我們複製拷貝的一個思想。深複製就好理解了,內存中存在了

兩份獨立對象本身。

用網上一哥們通俗的話將就是:

淺複製好比你和你的影子,你完蛋,你的影子也完蛋

深複製好比你和你的克隆人,你完蛋,你的克隆人還活着。

215.在iPhone應用中如何保存數據?

XML屬性列表(plist)歸檔

Preference(偏好設置)

NSKeyedArchiver歸檔(NSCoding)

SQLite3

Core Data

216.ViewController的didReceiveMemoryWarning怎麼被調用:

1、當程序收到內存警告時候ViewController會調用didReceiveMemoryWarning這個方法。

2、調用了這個方法之後,對view進行釋放並且調用viewDidUnload方法

3、從iOS3.0開始,不需要重載這個函數,把釋放內存的代碼放到viewDidUnload中去。

217.寫一個委託的interface

1.聲明一個協議(只有.h文件)

#import

@protocal協議名superMan<父協議NSObject>

@property NSString* name;

-(void)method;

@end

2.使一個類遵守協議

@interface TRMan:NSObject

多個協議要用,隔開

3.使用協議

id<協議名superMan>obj=[[TRMan alloc]init];

@ protocol MyDelegate

@interface MyClass : NSObject

@property(nonatomic,weak)id delegate;

@end

協議也可以沒有獨立文件,寫在類裏

#import

@class MyClass;

@protocol MyClassDelegate

-(void)protocolMethod;

@end

@interface MyClass : NSObject

@property(nonatomic,weak)id delegate;

@end

218.線程與進程的區別與聯繫

進程,是併發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,竟爭計算機系統資源的基本單位。每一個進程都有一個自己的地址空間,即進程空間或(虛空間)。進程空間的大小隻與處理機的位數有關,一個16位長處理機的進程空間大小爲216,而32位處理機的進程空間大小爲232。進程至少有5種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。

線程,在網絡或多用戶環境下,一個服務器通常需要接收大量且不確定數量用戶的併發請求,爲每一個請求都創建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。因此,操作系統中線程的概念便被引進了。

線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱爲輕權進程或輕量級進程,也是CPU調度的一個基本單位。

219.mvc設計模式是什麼?你還熟悉什麼設計模式

答:系統分爲三個部分: Model. View. Controller.在cocoa中,你的程序中的每一個object

(對象)都將明顯地僅屬於這三部分中的一個,而完全不屬於另外兩個.MVC課一幫助確保幫助實現程序最大程度的可重用性.各MVC元素彼此獨立運作,通過分開這些元素,可以構建可維護,可獨立更新的程序組建.

Delegate設計模式

Target-action設計模式

單例模式

220.什麼是沙箱模式?哪些操作屬於私有api範疇

某個iphone工程進行文件操作有此工程對應的指定的位置,不能逾越。

iphone沙箱模型的有四個文件夾,分別是什麼,永久數據存儲一般放在什麼位置,得到模擬器的路徑的簡單方式是什麼.

documents,tmp,app,Library。

(NSHomeDirectory()),

手動保存的文件在documents文件裏

Nsuserdefaults保存的文件在tmp文件夾裏

Documents目錄:您應該將所有de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。

AppName.app目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,

所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啓動。Library目錄:這個目錄下有兩個子目錄:Caches和Preferences

Preferences目錄包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.

Caches目錄用於存放應用程序專用的支持文件,保存應用程序再次啓動過程中需要的信息。tmp目錄:這個目錄用於存放臨時文件,保存應用程序再次啓動過程中不需要的信息。獲取這些目錄路徑的方法:

1,獲取家目錄路徑的函數:

NSString*homeDir=NSHomeDirectory();

2,獲取Documents目錄路徑的方法:

NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString*docDir=[pathsobjectAtIndex:0];

3,獲取Caches目錄路徑的方法:

NSArray*paths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);

NSString*cachesDir=[pathsobjectAtIndex:0];

4,獲取tmp目錄路徑的方法:

NSString*tmpDir=NSTemporaryDirectory();

5,獲取應用程序程序包中資源文件路徑的方法:

例如獲取程序包中一個圖片資源(apple.png)路徑的方法:

NSString*imagePath=[[NSBundlemainBundle]pathForResource:@”apple”ofType:@”png”];UIImage*appleImage=[[UIImagealloc]initWithContentsOfFile:imagePath];

代碼中的mainBundle類方法用於返回一個代表應用程序包的對象。

文件IO寫入

1,將數據寫到Documents目錄:

-(BOOL)writeApplicationData:(NSData*)datatoFile:(NSString*)fileName{

NSArray*paths=

NSUserDomainMask,YES);NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

NSString*docDir=[pathsobjectAtIndex:0];

if(!docDir){

NSLog(@”Documentsdirectorynotfound!”);returnNO;

}

NSString*filePath=[docDirstringByAppendingPathComponent:fileName];

return[datawriteToFile:filePathatomically:YES];

}

2,從Documents目錄讀取數據:

-(NSData*)applicationDataFromFile:(NSString*)fileName{

NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString*docDir=[pathsobjectAtIndex:0];

NSString*filePath=[docDirstringByAppendingPathComponent:fileName];

NSData*data=[[[NSDataalloc]initWithContentsOfFile:filePath]autorelease];

returndata;

}

NSSearchPathForDirectoriesInDomains這個主要就是返回一個絕對路徑用來存放我們需要儲存的文件。

-(NSString*)dataFilePath{

NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString*documentsDirectory=[pathsobjectAtIndex:0];

return[documentsDirectorystringByAppendingPathComponent:@"shoppingCar.plist"];}

NSFileManager*fm=[NSFileManagerdefaultManager];

if(![fmfileExistsAtPath:[selfdataFilePath]]){

//下面是對該文件進行制定路徑的保存

[fmcreateDirectoryAtPath:[selfdataFilePath]withIntermediateDirectories:YESattributes:nilerror:nil];

//取得一個目錄下得所有文件名

NSArray*files=[fmsubpathsAtPath:[selfdataFilePath]];

//讀取某個文件

NSData*data=[fmcontentsAtPath:[selfdataFilePath]];

//或者

NSData*data=[NSDatadataWithContentOfPath:[selfdataFilePath]];

}

iphone常見私有api的應用(比如直接發送短信,訪問沙箱之外的磁盤文件).

221.描述一下iOS SDK中如何實現MVC的開發模式

MVC是模型、視圖、控制器開發模式,對於iOS

SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖器來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是視圖器,由它負責控制視圖,訪問模型數據。

222.簡述淺拷貝和深拷貝

//淺拷貝就比如像引用類型,而深拷貝就比如值類型。

淺拷貝是指源對象與拷貝對象共用一份實體,僅僅是引用的變量不同(名稱不同)。對其中任何一個對象的改動都會影響另外一個對象。舉個例子,一個人一開始叫張三,後來改名叫李四了,可是還是同一個人,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個人倒黴。

深拷貝是指源對象與拷貝對象互相獨立,其中任何一個對象的改動都不會對另外一個對象造成影響。舉個例子,一個人名叫張三,後來用他克隆(假設法律允許)了另外一個人,叫李四,不管是張三缺胳膊少腿還是李四缺胳膊少腿都不會影響另外一個人。比較典型的就是Value(值)對象,如預定義類型Int32,Double,以及結構(struct),枚舉(Enum)等。

C#中有兩種類型變量,一種是值類型變量,一種是引用類型變量。對於前者,copy是屬於全盤複製;而對於後者,一般的copy只是淺copy,相當於只傳遞一個引用指針一樣。因此對於後者進行真正copy的時候,也是最費事的,具體的說,必須爲其實現ICloneable接口中提供的Clone方法。

淺拷貝(影子克隆):只複製對象的基本類型,對象類型,仍屬於原來的引用.

深拷貝(深度克隆):不緊複製對象的基本類,同時也複製原對象中的對象.就是說完全是新對象產生的.

223.在iPhone應用中如何保存數據

//ios程序中數據數據存儲有下列5種方式

XML屬性列表(plist)歸檔、Preference(偏好設置)、NSKeyedArchiver歸檔(NSCoding)、SQLite3、Core Data

每個iOS應用都有自己的應用沙盒(應用沙盒就是文件系統目錄),與其他文件系統隔離。應用的數據必須待在自己的沙盒裏,其他應用不能訪問該沙盒

224.假設有一個雙向循環列隊,每個節點保存了一個自然數,目前呈10,9,4,11的隊列,代碼寫出一個向其中插入數字20的算法

//沒找到

225.描述下tableView cell的重用機制,談談你是如何優化UITableView

//重用機制簡單的說意思一行一行的cell都是在複用的,滑動tableview的時候,剛離開視圖的cell會被放到複用池中,等下一個cell需要顯示時,會先看複用池中有沒有cell如果有的時候,就從複用池中拿出來cell,沒有的話就重新創建cell

使用不透明視圖。

不透明的視圖可以極大地提高渲染的速度。因此如非必要,可以將table cell及其子視圖的opaque屬性設爲YES(默認值)。

其中的特例包括背景色,它的alpha值應該爲1(例如不要使用clearColor);圖像的alpha值也應該爲1,或者在畫圖時設爲不透明。

不要重複創建不必要的table

cell。

前面說了,UITableView只需要一屏幕的UITableViewCell對象即可。因此在cell不可見時,可以將其緩存起來,而在需要時繼續使用它即可。

而UITableView也提供了這種機制,只需要簡單地設置一個identifier即可:

staticNSString *CellIdentifier = @"xxx"; UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) { cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier] autorelease]; }值得一提的是,cell被重用時,它內部繪製的內容並不會被自動清除,因此你可能需要調用setNeedsDisplayInRect:或setNeedsDisplay方法。

此外,在添加table cell的時候,如果不需要動畫效果,最好不要使用insertRowsAtIndexPaths:withRowAnimation:方法,而是直接調用reloadData方法。因爲前者會對所有indexPaths調用tableView:cellForRowAtIndexPath:方法,即便該cell並不需要顯示(不知道是不是bug),這就可能創建大量多餘的cell。勘誤:只是在模擬器上測試如此,真機調試時沒有這種bug。

減少視圖的數目。

UITableViewCell包含了textLabel、detailTextLabel和imageView等view,而你還可以自定義一些視圖放在它的contentView裏。然而view是很大的對象,創建它會消耗較多資源,並且也影響渲染的性能。

如果你的table

cell包含圖片,且數目較多,使用默認的UITableViewCell會非常影響性能。奇怪的是,使用自定義的view,而非預定義的view,明顯會快些。

當然,最佳的解決辦法還是繼承UITableViewCell,並在其drawRect:中自行繪製:

-(void)drawRect:(CGRect)rect { if (image) { [image drawAtPoint:imagePoint];self.image = nil; } else { [placeHolder drawAtPoint:imagePoint]; } [textdrawInRect:textRect withFont:font lineBreakMode:UILineBreakModeTailTruncation];}不過這樣一來,你會發現選中一行後,這個cell就變藍了,其中的內容就被擋住了。最簡單的方法就是將cell的selectionStyle屬性設爲UITableViewCellSelectionStyleNone,這樣就不會被高亮了。

此外還可以創建CALayer,將內容繪製到layer上,然後對cell的contentView.layer調用addSublayer:方法。這個例子中,layer並不會顯著影響性能,但如果layer透明,或者有圓角、變形等效果,就會影響到繪製速度了。解決辦法可參見後面的預渲染圖像。

不要做多餘的繪製工作。

在實現drawRect:的時候,它的rect參數就是需要繪製的區域,這個區域之外的不需要進行繪製。

例如上例中,就可以用CGRectIntersectsRect、CGRectIntersection或CGRectContainsRect判斷是否需要繪製image和text,然後再調用繪製方法。

預渲染圖像。

你會發現即使做到了上述幾點,當新的圖像出現時,仍然會有短暫的停頓現象。解決的辦法就是在bitmap context裏先將其畫一遍,導出成UIImage對象,然後再繪製到屏幕,詳細做法可見《利用預渲染加速iOS設備的圖像顯示》

不要阻塞主線程。

做到前幾點後,你的table

view滾動時應該足夠流暢了,不過你仍可能讓用戶感到不爽。常見的現象就是在更新數據時,整個界面卡住不動,完全不響應用戶請求。

出現這種現象的原因就是主線程執行了耗時很長的函數或方法,在其執行完畢前,無法繪製屏幕和響應用戶請求。其中最常見的就是網絡請求了,它通常都需要花費數秒的時間,而你不應該讓用戶等待那麼久。

解決辦法就是使用多線程,讓子線程去執行這些函數或方法。這裏面還有一個學問,當下載線程數超過2時,會顯著影響主線程的性能。因此在使用ASIHTTPRequest時,可以用一個NSOperationQueue來維護下載請求,並將其maxConcurrentOperationCount設爲2。而NSURLRequest則可以配合GCD來實現,或者使用NSURLConnection的setDelegateQueue:方法。

當然,在不需要響應用戶請求時,也可以增加下載線程數,以加快下載速度:

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate { if (!decelerate) {queue.maxConcurrentOperationCount = 5; } } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {queue.maxConcurrentOperationCount = 5; } -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {queue.maxConcurrentOperationCount = 2; }此外,自動載入更新數據對用戶來說也很友好,這減少了用戶等待下載的時間。例如每次載入50條信息,那就可以在滾動到倒數第10條以內時,加載更多信息:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (count - indexPath.row< 10 && !updating) { updating = YES; [self update]; } }// update方法獲取到結果後,設置updating爲NO還有一點要注意的就是當圖片下載完成後,如果cell是可見的,還需要更新圖像:

NSArray*indexPaths = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *visibleIndexPathin indexPaths) { if (indexPath == visibleIndexPath) { MyTableViewCell *cell =(MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; cell.image= image; [cell setNeedsDisplayInRect:imageRect]; break; } }//也可不遍歷,直接與頭尾相比較,看是否在中間即可。最後還是前面所說過的insertRowsAtIndexPaths:withRowAnimation:方法,插入新行需要在主線程執行,而一次插入很多行的話(例如50行),會長時間阻塞主線程。而換成reloadData方法的話,瞬間就處理完了。

226.做過IM開發麼,談談對XMPPFramework的瞭解

//XMPPFramework是一個OS X/iOS平臺的開源項目,使用Objective-C實現了XMPP協議(RFC-3920),同時還提供了用於讀寫XML的工具,大大簡化了基於XMPP的通信應用的開發。

XMPP中常用對象們

XMPPStream:xmpp基礎服務類

XMPPRoster:好友列表類

XMPPRosterCoreDataStorage:好友列表(用戶賬號)在core

data中的操作類

XMPPvCardCoreDataStorage:好友名片(暱稱,簽名,性別,年齡等信息)在coredata中的操作類

XMPPvCardTemp:好友名片實體類,從數據庫裏取出來的都是它

xmppvCardAvatarModule:好友頭像

XMPPReconnect:如果失去連接,自動重連

XMPPRoom:提供多用戶聊天支持

XMPPPubSub:發佈訂閱

源碼地址:http://code.google.com/p/xmppframework/,目前需要使用git才能download到源碼。

227.你是如何實現多屏幕適配的

//一、iOS屏幕適配發展歷程

設備

適配技術

4及以前(iPad未出)

直接用代碼計算

有了iPad

autoResizing

有不同屏幕的iPhone後

autoLayout

有更多不同屏幕的iPhone後

sizeClass

二、各個技術的特性

1、autoLayout

幫我們確定在不同設備、不同(父view)環境下,同一個可視單元所應具有合適的位置和尺寸(任何兩個視圖的關係都可以確定)

1. autoLayout的用法:

ï直接建立約束條件

•[self.viewaddConstraint: [NSLayoutConstraintconstraintWithItem:blueView attribute:NSLayoutAttributeLeftrelatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeLeftmultiplier:1 constant:0]];

這樣雖然代碼量比較大,但是是絕對可行的辦法,也是使用autoLayout最根本的辦法之一。

ï使用VFL語言

- (void)viewDidLoad {

[super viewDidLoad];

UIButton *button=[[UIButtonalloc]init];

[button setTitle:@"點擊一下"forState:UIControlStateNormal];

button.translatesAutoresizingMaskIntoConstraints=NO;

[button setBackgroundColor:[UIColorblackColor]];

[self.view addSubview:button];

NSArray *constraints1=[NSLayoutConstraint

constraintsWithVisualFormat:@"H:|-[button]-|"options:0 metrics:nil

views:NSDictionaryOfVariableBindings(button)];

NSArray *constraints2=[NSLayoutConstraint

constraintsWithVisualFormat:@"V:|-20-[button(==30)]"options:0metrics:nil

views:NSDictionaryOfVariableBindings(button)];

[self.viewaddConstraints:constraints1];

[self.viewaddConstraints:constraints2];

}

ï使用使用第三方庫,如:Masonry、UIView+AutoLayout……

autoLayout的好處:

ï你基本上可以不用考慮3.5寸和4寸以及即將上市的x.x寸屏幕不同分辨率的問題,你終於可以不用在viewDidLoad方法裏判斷不同分辨率下,不同控件應該放在哪裏,或者針對不同分辨率寫不同的storyboard和xib;

ï你可以拋棄那些根據不同文字來計算tableViewCell、UILabel高度的代碼了,因爲autolayout會幫你自動計算好;

ï如果你的佈局在橫屏豎屏下變化不是特別大,你不用再爲橫着豎着寫兩套代碼或者寫兩個storyboard/xib了;

2.sizeClass

在iOS8中,新增了Size Classes特性,它是對當前所有iOS設備尺寸的一個抽象。那我們就只把屏幕的寬和高分別分成三種情況:Compact:緊湊、Regular:寬鬆、Any:任意。

這樣寬和高三三一整合,一共9中情況。如下圖所示,針對每一種情況。我們可以在每種情況下設置不同的佈局(包括控件的約束,甚至是控件是否顯示)

sizeClass.png

對sizeClass的理解:sizeClass的實質是將iOS屏幕分成了不同的抽象概念,這些不同的抽象組合,對應着不同的設備屏幕。所以,利用sizeClass可以針對同一套UI,來適配所有的屏幕。注意:這些所有的適配,都是利用autoLayout來實現的,sizeClass只是負責提供不同的屏幕尺寸。

228.談談你瞭解的設計模式,你用過哪些,他們的優缺點

//(一)代理模式

應用場景:當一個類的某些功能需要由別的類來實現,但是又不確定具體會是哪個類實現。

優勢:解耦合

敏捷原則:開放-封閉原則

實例:tableview的數據源delegate,通過和protocol的配合,完成委託訴求。

列表row個數delegate

自定義的delegate

(二)觀察者模式

應用場景:一般爲model層對,controller和view進行的通知方式,不關心誰去接收,只負責發佈信息。

優勢:解耦合

敏捷原則:接口隔離原則,開放-封閉原則

實例:Notification通知中心,註冊通知中心,任何位置可以發送消息,註冊觀察者的對象可以接收。

kvo,鍵值對改變通知的觀察者,平時基本沒用過。

(三)MVC模式

應用場景:是一中非常古老的設計模式,通過數據模型,控制器邏輯,視圖展示將應用程序進行邏輯劃分。

優勢:使系統,層次清晰,職責分明,易於維護

敏捷原則:對擴展開放-對修改封閉

實例:model-即數據模型,view-視圖展示,controller進行UI展現和數據交互的邏輯控制。

(四)單例模式

應用場景:確保程序運行期某個類,只有一份實例,用於進行資源共享控制。

優勢:使用簡單,延時求值,易於跨模塊

敏捷原則:單一職責原則

實例:[UIApplication sharedApplication]。

注意事項:確保使用者只能通過getInstance方法才能獲得,單例類的唯一實例。

java,C++中使其沒有公有構造函數,私有化並覆蓋其構造函數。

object c中,重寫allocWithZone方法,保證即使用戶用alloc方法直接創建單例類的實例,

返回的也只是此單例類的唯一靜態變量。

(五)策略模式

應用場景:定義算法族,封裝起來,使他們之間可以相互替換。

優勢:使算法的變化獨立於使用算法的用戶

敏捷原則:接口隔離原則;多用組合,少用繼承;針對接口編程,而非實現。

實例:排序算法,NSArray的sortedArrayUsingSelector;經典的鴨子會叫,會飛案例。

注意事項:1,剝離類中易於變化的行爲,通過組合的方式嵌入抽象基類

2,變化的行爲抽象基類爲,所有可變變化的父類

3,用戶類的最終實例,通過注入行爲實例的方式,設定易變行爲

防止了繼承行爲方式,導致無關行爲污染子類。完成了策略封裝和可替換性。

(六)工廠模式

應用場景:工廠方式創建類的實例,多與proxy模式配合,創建可替換代理類。

優勢:易於替換,面向抽象編程,application只與抽象工廠和易變類的共性抽象類發生調用關係。

敏捷原則:DIP依賴倒置原則

實例:項目部署環境中依賴多個不同類型的數據庫時,需要使用工廠配合proxy完成易用性替換

注意事項:項目初期,軟件結構和需求都沒有穩定下來時,不建議使用此模式,因爲其劣勢也很明顯,

增加了代碼的複雜度,增加了調用層次,增加了內存負擔。所以要注意防止模式的濫用。

229.數據持久化存儲方案有哪些?

//同223題

230.網絡通信用過哪些方式?

1、使用socket的方式進行通信。

2、使用asynsocket類庫進行通信。

231.現有100個數字的亂序數組,請用一種方法將它排序.只需寫出過程就行.如果亂序數組裏的元素增加到10000個,請再次將它排序.

答:

int n = array.Length;

for (int i = 0; i < n - 1; i++){

for (int j = 0 ; j > n - i - 1; j++){

if (array[j] > array[j + 1]) {

int temp = array[j ];

array[j] = array[j + 1];

array[j + 1] = temp;

}

}

}

232.用你擅長的語言,寫出獲取當前系統時間的代碼。

答:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]];

[formatter setDateFormat:@"yy-MM-dd HH:mm"];

NSString *currentTime = [formatter stringFromDate:[NSDate date]];

NSLog(@"%@",currentTime);

233.請描述下“極客幫SOHO”是如何替程序員賺到錢的。

答:

極客邦SOHO是獨立程序員兼職任務協同平臺,專業服務程序員,IT技術的兼職,衆包服務,交易服務,兼職服務,幫助程序員賺錢looip.cncoding.net,外快。

234.寫一個標準的宏MIN,這個宏輸入兩個參數並返回較小的一個.

#define MIN(X,Y)((X)>(Y)?(Y):(X))

235.Obj-c有多重繼承嗎?不是的話有什麼替代方法?

答:

cocoa中所有的類都是NSObject的子類,多繼承在這裏是用protocol委託代理來實現的。你不用去考慮繁瑣的多繼承,虛基類的概念。多態特性在obj-c中通過委託來實現。

236.Static全局變量與普通的全局變量有什麼區別?static局部變量和普通局部變量有什麼區別?static函數與普通函數有什麼區別?

答:

static全局變量與普通的全局變量有什麼區別:static全局變量只初使化一次,防止在其他文件單元中被引用;

static局部變量和普通局部變量有什麼區別:static局部變量只被初始化一次,下一次依據上一次結果值;

static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

237.MVC模式的理解

答:

MVC,全稱Model(模型)-View(視圖)-Controller(控制器),這是一種開發模式,他的好處是可以將界面和業務邏輯分離。

Model(模型),是程序的主體部分,主要包含業務數據和業務邏輯。在模型層,還會涉及到用戶發佈的服務,在服務中會根據不同的業務需求,更新業務模型中的數據。

View(視圖),是程序呈現給用戶的部分,是用戶和程序交互的接口,用戶會根據具體的業務需求,在View視圖層輸入自己特定的業務數據,並通過界面的事件交互,將對應的輸入參數提交給後臺控制器進行處理。

Controller(控制器),Controller是用來處理用戶輸入數據,已經更新業務模型的部分。控制器中接收了用戶與界面交互時傳遞過來的數據,並根據數據業務邏輯來執行服務的調用和更新業務模型的數據和狀態。

238.用變量a給出下面的定義

a)一個整型數(An integer)

b)一個指向整型數的指針(A pointer to an integer)

c)一個指向指針的的指針,它指向的指針是指向一個整型數(A pointer to a pointer to an integer)

d)一個有10個整型數的數組(An array of 10 integers)

e)一個有10個指針的數組,該指針是指向一個整型數的(An array of 10 pointers to integers)

f)一個指向有10個整型數數組的指針(A pointer to an array of 10 integers)

g)一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)

h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數(An array of ten pointers to functions that take an integer argument and return an integer)

答案:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int);

// A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int);

// An array of 10 pointers to functions that take an integer argument and return an integer

301、在一個數組中存在一萬條以上的字符串,現在要對數組中所有字符串進行拼接操作,請寫出拼接方法(要考慮到性能及內存佔用情況,ARC模式)。

NSString *string = [arraycomponentsJoinedByString:@","];

302、請舉例說明代理和通知兩種方式分別適合在什麼情況下使用?

代理:一般控件用的比較多,其實也可以用block實現,如果實現的接口比較多的話,建議用代理,如UITableview。

通知:這東西是全局的,而且是同步的,如果你要全局發送消息,並且做的事情時間不長,不會阻塞線程的話,建議使用。

303、是否使用過SQLite或者FMDataBase對數據庫進行操作,並試述對事務概念的理解。

FMDatabase是IOS中Sqlite數據庫操作類

304、以下兩種GCD隊列創建有什麼不同?

dispatch_queue_t queue = dispatch_queue_create("MyQueue",DISPATCH_QUEUE_SERIAL);

dispatch_queue_t queue =dispatch_queue_create(@“MyQueue", DISPATCH_QUEUE_CONCURRENT);

//生成一個串行隊列,隊列中的block按照先進先出(FIFO)的順序去執行,實際上爲單線程執行。第一個參數是隊列的名稱,在調試程序時會非常有用,所有儘量不要重名了。

//生成一個併發執行隊列,block被分發到多個線程去執行

305、運行以下代碼會打印什麼結果?爲什麼?

dispatch_queue_t queue =dispatch_queue_create("MyQueue", DISPATCH_QUEUE_SERIAL);

dispatch_apply(3, queue, ^(size_t i) {

NSLog(@"apply loop:%zu", i);

dispatch_apply(3, queue, ^(size_t j) {

NSLog(@"apply loop inside:%zu", j);

});

});

apply loop:0

306、簡單說明你對block的理解以及使用block有什麼好處。

答:block是對象,它封裝了一段代碼,這段代碼可以在任何時候執行。block可以作爲函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:block是inline的,並且它對局部變量是隻讀的。

好處: Blocks更清晰。比如一個viewController中有多個彈窗事件,Delegate就得對每個事件進行判斷識別來源。而Blocks就可以在創建事件的時候區分開來了。這也是爲什麼現在蘋果API中越來越多地使用Blocks而不是Delegate。

307、setValue:forKey和setObject:forKey的區別是什麼?

答: 1, setObject:forkey:中value是不能夠爲nil的,不然會報錯。

setValue:forKey:中value能夠爲nil,但是當value爲nil的時候,會自動調用removeObject:forKey方法

2, setValue:forKey:中key的參數只能夠是NSString類型,而setObject:forKey:的可以是任何類型

308、try-catch-finally的作用和使用方法。

Java:

1,一個方法內可以有多個try…catch…finally語句塊,還可以彼此嵌套,比如下面這個方法:

2,如果一個有返回值的方法內有多個try…catch…finally語句塊,return語句要麼寫在任意一個try…catch內,要麼寫在方法的最後,否則編譯無法通過,如果return語句寫在方法的最後,那麼以上try…catch…finally語句中的每一個finally塊內的代碼都將會執行;

3,無論方法內是否發生異常(jvm可以處理的異常),finally塊內的代碼都將會執行。

309、請寫出同步網絡請求和異步網絡請求函數。

答:首先在ios模擬器上創建一個text窗口(我起名叫tongbu):

//同步網絡請求函數

//獲取名叫tongbu文本框的內容

NSString *txt=self.tongbu.text;

//創建url對象

NSURL *url=[NSURLURLWithString:txt];

//創建請求對象

NSURLRequest*req=[NSURLRequest requestWithURL:url];

//發起同步,趕回數據給data

NSData*data=[NSURLConnection sendSynchronousRequest:req returningResponse:nilerror:nil];

//異步網絡請求

在ViewController.m文件上的- (void)viewDidLoad方法裏

NSString*txt2=self.tongbu.text;

//創建url對象

NSURL *url2=[NSURLURLWithString:txt2];

//創建請求對象

NSURLRequest*req2=[NSURLRequest requestWithURL:url2];

//發送請求並建立一個代理

[NSURLConnectionconnectionWithRequest:req2 delegate:self];

//因爲代理人是自己所以讓自己遵守協議

協議在ViewController.h文件裏

@interface ViewController :

UIViewController//因爲代理對象是對象所以讓自己遵守協議

//同時創建一個NSMutableData類型的對象來接從網絡上接收的數據,同時創建3個協議方法來進行接收數據

@property(retain,nonatomic)NSMutableData*data;

//協議方法

//1連接接收響應,表示成功建立連接

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response{

self.data=[[NSMutableData alloc]init];//創建代理對象,並初始化數據

}

//2連接接收數據

//形參(NSData *)表示接收到的數據

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data{

[self.data

appendData:data];//向data反覆添加數據

}

//3連接成功

-(void)connectionDidFinishLoading:(NSURLConnection*)connection{

NSLog(@"連接成功");

}

310、從用戶體驗角度舉例說明同步和異步。

答:1.同步意爲着線程阻塞,在主線程中使用此方法會不響應任何用戶事件。所以,在應用程序設計時,大多被用在專門的子線程增加用戶體驗,或用異步請求代替。

2.異步請求的好處是不阻塞當前線程,但相對於同步請求略爲複雜,至少要添加兩個回調方法來獲取異步事件

答:從用戶的體驗來說,異步請求數據的APP比同步請求的APP操作更加流暢,快捷,

312、聲明NSString類型的屬性時,用copy和strong的區別是什麼?

copy修飾的NSString,在初始化時,如果來源是NSMutableString的話,會對來源進行一次深拷貝,將來源的內存地址複製一份,這樣,兩個對象就一點關係就沒有了,無論你怎麼操作來源,都不會對自己的NSString有任何影響

313、談談Object-C的內存管理方式及過程?

從一段內存被申請之後,就存在一個變量用於保存這段內存被使用的次數,我們暫時把它稱爲計數器,當計數器變爲0的時候,那麼就是釋放這段內存的時候,比如說,當在程序A裏面一段內存被成功申請完成之後,那麼這個計數器就從0變成了1(我們把這個過程叫做alloc)然後程序B也需要使用這個內存,那麼計數器就從1變成了2(我們把這個過程叫做retain)緊接着程序A不再需要這段內存了,那麼程序A就把這個計數器減1(我們把這個過程叫做release)程序B也不再需要這段內存的時候,那麼也把計數器減1(這個過程還是release)當系統(也就是Foundation)發現這個計數器變成了0,那麼就會調用內存回收程序把這段內存回收(我們把這個過程叫做dealloc)

314、static全局變量與普通的全局變量有什麼區別?static普通函數有什麼區別?

全局變量(外部變量)的說明之前再冠以static就構成了靜態的全局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。從以上分析可以看出,把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作用域,限制了它的使用範圍。static函數與普通函數有什麼區別?只在當前源文件中使用的函數應該說明爲內部函數(static),內部函數應該在

當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件。

315、Objective-C堆和棧的區別?

答:管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程序員控制,容易產生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閒內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

碎片問題:對於堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對於棧來講,則不會存在這個問題,因爲棧是先進後出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個內存塊從棧中間彈出

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

316、__block和__weak修飾符的區別是什麼?

答:1,在MRC時代,__block修飾,可以避免循環引用;ARC時代,__block修飾,同樣會引起循環引用問題;

2,__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型;

3,__weak只能在ARC模式下使用,也只能修飾對象,不能修飾基本數據類型;

4,__block對象可以在block中被重新賦值,__weak不可以;

317、如何解決TableView卡頓的問題?

1.答:使用不透明視圖。

2.不要重複創建不必要的table

cell。

3.減少視圖的數目。

4.不要做多餘的繪製工作。

5.預渲染圖像。

6.不要阻塞主線程。當然,在不需要響應用戶請求時,也可以增加下載線程數,以加快下載速度:

318、簡要說下Http通信協議的原理,與Socket協議的區別有哪些?

答:HTTP協議:簡單對象訪問協議,對應於應用層,HTTP協議是基於TCP連接的

tcp協議:對應於傳輸層

ip協議:對應於網絡層

TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。

Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,才能使用TCP/IP協議。

http連接:http連接就是所謂的短連接,即客戶端向服務器端發送一次請求,服務器端響應後連接即會斷掉;

socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由於各種環境因素可能會是連接斷開,比如說:服務器端或客戶端主機down了,網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火牆可能會斷開該連接以釋放網絡資源。

319、MVC是什麼?有什麼特性?你還熟悉哪些設計模式,請簡要說明。

他們有重複的

320、autorelease和垃圾回收機制(gc)有什麼關係?

答:autorelease只是延遲釋放,gc是每隔一段時間詢問程序,看是否有無指針指向的對象,若有,就將它回收。他們兩者沒有什麼關係。

321、假設類名爲MyManager的類有以下單例方法,請寫出單例方法的實現:+(MyManager *)sharedManager;

答:+ (MyManager*)sharedManager

{

static MyManager *sharedMyManagerInstance = nil;

static dispatch_once_t predicate;

dispatch_once(&predicate, ^{

sharedMyManagerInstance =[[self alloc] init];

});

return sharedMyManagerInstance;

}

322、全局變量可不可以定義在可被多個.C文件包含的頭文件中?爲什麼?

答:可以.在不適用static或者const(隱式static)情況下,變量的定義只能出現一次,否則會導致重複定義。但卻可以聲明多次。因此全局變量不可以定義在頭文件中。因爲當該頭文件被多個c文件包含的話,會導致重複定義。因此一般做法是在某個特定的頭文件中聲明,而在另外一個特定的c文件中定義。需要使用就包含前者。

323、TCP/IP通信建立的過程怎樣,端口有什麼作用?

答:發出將建立通信會話的第一個數據包之前,發送方主機上的TCP/IP協議執行以下四個不同的步驟:

1.TCP/IP將主機名或NetBIOS名稱解析爲IP地址。

2.使用目標IP地址和IP路由表,TCP/IP確定要使用的接口和下一躍點IP地址。

3.對於共享訪問技術(例如,以太網、令牌環和分佈式光纖數據接口(FDDI))上的單播IP流量,地址解析協議(ARP)將下一躍點IP地址解析爲媒體訪問控制(MAC)地址(也稱爲數據鏈接層地址)。

對於以太網和FDDI上的多播IP流量,目標多播IP地址會被映射到相應的多播MAC地址。對於令牌環上的多播IP流量,使用功能地址0xC0-00-00-04-00-00。對於共享訪問技術上的廣播流量,MAC地址會被映射到0xFF-FF-FF-FF-FF-FF。4.之後,IP數據報會被髮送到通過ARP解析的MAC地址、多播映射或MAC級廣播地址。

網絡訪問要通過不同的協議進行,各種協議要通過不同的端口進行訪問,如25端口是郵件端口,3389超級終端(就是木馬程序最想打開的端口),8000=騰訊OICQ服務器端等等很多很多,記住常用的幾個就可以了。

端口:說白了就相當於門,每個門都對應着相對的TCP/IP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章