天天看點

IOS部分面試題

之前看了很多面試題,感覺要不是不夠就是過于備援,于是我将網上的一些面試題進行了删減和重排,現在分享給大家。(題目來源于網絡,侵删)

1. Object-c的類可以多重繼承麼?可以實作多個接口麼?Category是什麼?重寫一個類的方式用繼承好還是分類好?為什麼?

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

2. #import 跟#include 又什麼差別,@class呢, #import<> 跟 #import””又什麼差別?

答:#import是Objective-C導入頭檔案的關鍵字,#include是C/C++導入頭檔案的關鍵字,使用#import頭檔案會自動隻導入一次,不會重複導入,相當于#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,才去檢視類的實作檔案,可以解決頭檔案的互相包含;#import<>用來包含系統的頭檔案,#import””用來包含使用者頭檔案。

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

答:

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

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

3). assign 是指派特性,setter方法将傳入參數指派給執行個體變量;僅設定變量時;

4). retain 表示持有特性,setter方法将傳入參數先保留,再指派,傳入參數的retaincount會+1;

5). copy 表示指派特性,setter方法将傳入對象複制一份;需要完全一份新的變量時。

6).nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic

4.寫一個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;
}      

5.對于語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運作時分别時什麼類型的對象?

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

6.常見的object-c的資料類型有那些, 和C的基本資料類型有什麼差別?如:NSInteger和int

答:object-c的資料類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後便是對象,而C語言的基本資料類型int,隻是一定位元組的記憶體空間,用于存放數值;NSInteger是基本資料類型,并不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本資料類型Int或者Long的别名(NSInteger的定義typedef long NSInteger),它的差別在于,NSInteger會根據系統是32位還是64位來決定是本身是int還是Long。

7.id 聲明的對象有什麼特性?

答:Id 聲明的對象具有運作時的特性,即可以指向任意類型的objcetive-c的對象;

8.Objective-C如何對記憶體管理的,說說你的看法和解決方法?

答:Objective-C的記憶體管理主要有三種方式ARC(自動記憶體計數)、手動記憶體計數、記憶體池。

1). (Garbage Collection)自動記憶體計數:這種方式和java類似,在你的程式的執行過程中。始終有一個高人在背後準确地幫你收拾垃圾,你不用考慮它什麼時候開始工作,怎樣工作。你隻需要明白,我申請了一段記憶體空間,當我不再使用進而這段記憶體成為垃圾的時候,我就徹底的把它忘記掉,反正那個高人會幫我收拾垃圾。遺憾的是,那個高人需要消耗一定的資源,在攜帶裝置裡面,資源是緊俏商品是以iPhone不支援這個功能。是以“Garbage Collection”不是本入門指南的範圍,對“Garbage Collection”内部機制感興趣的同學可以參考一些其他的資料,不過說老實話“Garbage Collection”不大适合适初學者研究。

解決: 通過alloc – initial方式建立的, 建立後引用計數+1, 此後每retain一次引用計數+1, 那麼在程式中做相應次數的release就好了.

2). (Reference Counted)手動記憶體計數:就是說,從一段記憶體被申請之後,就存在一個變量用于儲存這段記憶體被使用的次數,我們暫時把它稱為計數器,當計數器變為0的時候,那麼就是釋放這段記憶體的時候。比如說,當在程式A裡面一段記憶體被成功申請完成之後,那麼這個計數器就從0變成1(我們把這個過程叫做alloc),然後程式B也需要使用這個記憶體,那麼計數器就從1變成了2(我們把這個過程叫做retain)。緊接着程式A不再需要這段記憶體了,那麼程式A就把這個計數器減1(我們把這個過程叫做release);程式B也不再需要這段記憶體的時候,那麼也把計數器減1(這個過程還是release)。當系統(也就是Foundation)發現這個計數器變 成員了0,那麼就會調用記憶體回收程式把這段記憶體回收(我們把這個過程叫做dealloc)。順便提一句,如果沒有Foundation,那麼維護計數器,釋放記憶體等等工作需要你手工來完成。

解決:一般是由類的靜态方法建立的, 函數名中不會出現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 建立後引用計數+0, 在函數出棧後釋放, 即相當于一個棧上的局部變量. 當然也可以通過retain延長對象的生存期.

3). (NSAutoRealeasePool)記憶體池:可以通過建立和釋放記憶體池控制記憶體申請和回收的時機.

解決:是由autorelease加入系統記憶體池, 記憶體池是可以嵌套的, 每個記憶體池都需要有一個建立釋放對, 就像main函數中寫的一樣. 使用也很簡單, 比如[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 即将一個NSString對象加入到最内層的系統記憶體池, 當我們釋放這個記憶體池時, 其中的對象都會被釋放.

9. 原子(atomic)跟非原子(non-atomic)屬性有什麼差別?

答:

1). atomic提供多線程安全。是防止在寫未完成的時候被另外一個線程讀取,造成資料錯誤

2). non-atomic:在自己管理記憶體的環境中,解析的通路器保留并自動釋放傳回的值,如果指定了 nonatomic ,那麼通路器隻是簡單地傳回這個值。

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

NSMutableArray*?ary?=?[[NSMutableArray?array]?retain];
NSString?*str?=?[NSString?stringWithFormat:@"test"];
[str?retain];
[aryaddObject:str];
NSLog(@”%@%d”,str,[str?retainCount]);
[str?retain];
[str?release];
[str?release];
NSLog(@”%@%d”,str,[str?retainCount]);
[aryremoveAllObjects];
NSLog(@”%@%d”,str,[str?retainCount]);      

str的retainCount建立+1,retain+1,加入數組自動+1 3

retain+1,release-1,release-1 2

數組删除所有對象,所有數組内的對象自動-1 1

11. 記憶體管理的幾條原則時什麼?按照預設法則.那些關鍵字生成的對象需要手動釋放?在和property結合的時候怎樣有效的避免記憶體洩露?

答:誰申請,誰釋放

遵循Cocoa Touch的使用原則;

記憶體管理主要要避免“過早釋放”和“記憶體洩漏”,對于“過早釋放”需要注意@property設定特性時,一定要用對特性關鍵字,對于“記憶體洩漏”,一定要申請了要負責釋放,要細心。

關鍵字alloc 或new 生成的對象需要手動釋放;

設定正确的property屬性,對于retain需要在合适的地方釋放,

12.如何對iOS裝置進行性能測試?

答: Profile-> Instruments ->Time Profiler

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

答:線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,然後将其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:

14. MVC設計模式是什麼? 你還熟悉什麼設計模式?

答:

設計模式:并不是一種新技術,而是一種編碼經驗,使用比如java中的接口,iphone中的協定,繼承關系等基本手段,用比較成熟的邏輯去處理某一種類型的事情,總結為所謂設計模式。面向對象程式設計中,java已經歸納了23種設計模式。

mvc設計模式 :模型,視圖,控制器,可以将整個應用程式在思想上分成三大塊,對應是的資料的存儲或處理,前台的顯示,業務邏輯的控制。 Iphone本身的設計思想就是遵循mvc設計模式。其不屬于23種設計模式範疇。

代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用.比如一個工廠生産了産品,并不想直接賣給使用者,而是搞了很多代理商,使用者可以直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回複就屬于代理攔截,代理模式在iphone中得到廣泛應用.

單例模式:說白了就是一個類不通過alloc方式建立對象,而是用一個靜态方法傳回這個類的對象。系統隻需要擁有一個的全局對象,這樣有利于我們協調系統整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調用都可以得到 UIApplication的對象,這個對象是全局唯一的。

觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實作起來無非就是把所有觀察者的對象給這個物體,當這個物體的發生改變,就會調用周遊所有觀察者的對象調用觀察者的方法進而達到通知觀察者的目的。

工廠模式:

public?class?Factory{
public?static?Sample?creator(int?which){
if?(which==1)
return?new?SampleA();
else?if?(which==2)
return?new?SampleB();
}
}      

15 淺複制和深複制的差別?

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

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

意思就是說我有個A對象,複制一份後得到A_copy對象後,對于淺複制來說,A和A_copy指向的是同一個記憶體資源,複制的隻不過是是一個指針,對象本身資源

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

兩份獨立對象本身。

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

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

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

16. 類别的作用?繼承和類别在實作中有何差別?

答:category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,隻能添加,不能删除修改,并且如果類别和原來類中的方法産生名稱沖突,則類别将覆寫原來的方法,因為類别具有更高的優先級。

類别主要有3個作用:

1).将類的實作分散到多個不同檔案或多個不同架構中。

2).建立對私有方法的前向引用。

3).向對象添加非正式協定。

繼承可以增加,修改或者删除方法,并且可以增加屬性。

17. 類别和類擴充的差別。

答:category和extensions的不同在于 後者可以添加屬性。另外後者添加的方法是必須要實作的。

extensions可以認為是一個私有的Category。

18. oc中的協定和java中的接口概念有何不同?

答:OC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。

informal protocol中的方法屬于設計模式考慮範疇,不是必須實作的,但是如果有實作,就會改變類的屬性。

其實關于正式協定,類别和非正式協定我很早前學習的時候大緻看過,也寫在了學習教程裡

“非正式協定概念其實就是類别的另一種表達方式“這裡有一些你可能希望實作的方法,你可以使用他們更好的完成工作”。

這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類别去實作。然後你在後期可以直接使用這些更好的方法。

這麼看,總覺得類别這玩意兒有點像協定的可選協定。”

現在來看,其實protocal已經開始對兩者都統一和規範起來操作,因為資料中說“非正式協定使用interface修飾“,

現在我們看到協定中兩個修飾詞:“必須實作(@requied)”和“可選實作(@optional)”。

19. 什麼是KVO和KVC?

答:KVC:鍵 – 值編碼是一種間接通路對象的屬性使用字元串來辨別屬性,而不是通過調用存取方法,直接或通過執行個體變量通路的機制。

很多情況下可以簡化程式代碼。apple文檔其實給了一個很好的例子。

KVO:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。

具體用看到嗯哼用到過的一個地方是對于按鈕點選變化狀态的的監控。

比如我自定義的一個button

[self?addObserver:self?forKeyPath:@"highlighted"?options:0?context:nil];
#pragma?mark?KVO
-?(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void?*)context
{
if?([keyPath?isEqualToString:@"highlighted"]?)?{
[self?setNeedsDisplay];
}
}      

對于系統是根據keypath去取的到相應的值發生改變,理論上來說是和kvc機制的道理是一樣的。

對于kvc機制如何通過key尋找到value:

“當通過KVC調用對象時,比如:[self valueForKey:@”someKey”]時,程式會自動試圖通過幾種不同的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續查找對象是否帶有someKey這個執行個體變量(iVar),如果還沒有找到,程式會繼續試圖調用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實作的話,程式會抛出一個NSUndefinedKeyException異常錯誤。

(cocoachina.com注:Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找執行個體變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)

設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最後的機會響應這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處。“

來至cocoa,這個說法應該挺有道理。

因為我們知道button卻是存在一個highlighted執行個體變量.是以為何上面我們隻是add一個相關的keypath就行了,

可以按照kvc查找的邏輯了解,就說的過去了。

20. 代理的作用?

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

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

21. oc中可修改和不可以修改類型。

答:可修改不可修改的集合類。這個我個人簡單了解就是可動态添加修改和不可動态添加修改一樣。

比如NSArray和NSMutableArray。前者在初始化後的記憶體控件就是固定不可變的,後者可以添加等,可以動态申請新的記憶體空間。

22. 我們說的oc是動态運作時語言是什麼意思?

答:多态。 主要是将資料類型的确定由編譯時,推遲到了運作時。

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

簡單來說,運作時機制使我們直到運作時才去決定一個對象的類别,以及調用該類别對象指定方法。

多态:不同對象以自己的方式響應相同的消息的能力叫做多态。意思就是假設生物類(life)都用有一個相同的方法-eat;

那人類屬于生物,豬也屬于生物,都繼承了life後,實作各自的eat,但是調用是我們隻需調用各自的eat方法。

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

是以也可以說,運作時機制是多态的基礎?~~~

23. 通知和協定的不同之處?

答:協定有控制鍊(has-a)的關系,通知沒有。

首先我一開始也不太明白,什麼叫控制鍊(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大緻可以有自己的了解

簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。

代理按我們的了解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。

隻是對于不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個釋出會,代理人發出處理釋出會的消息後,别稱B的

釋出會了。但是通知就不一樣,他隻關心發出通知,而不關心多少接收到感興趣要處理。

是以控制鍊(has-a從英語單詞大緻可以看出,單一擁有和可控制的對應關系。

24. 什麼是推送消息?

答:推送通知更是一種技術。

簡單點就是用戶端擷取資源的一種手段。

普通情況下,都是用戶端主動的pull。

推送則是伺服器端主動push。 測試push的實作可以檢視該博文。

25. 關于多态性

答:多态,子類指針可以指派給父類。

這個題目其實可以出到一切面向對象語言中,

是以關于多态,繼承和封裝基本最好都有個自我意識的了解,也并非一定要把書上資料上寫的能背出來

26. 對于單例的了解

答:在objective-c中要實作一個單例類,至少需要做以下四個步驟:

1).為單例對象實作一個靜态執行個體,并初始化,然後設定成nil,

2).實作一個執行個體構造方法檢查上面聲明的靜态執行個體是否為nil,如果是則建立并傳回一個本類的執行個體,

3).重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不産生一個新執行個體,

4).适當實作allocWitheZone,copyWithZone,release和autorelease。

27. 說說響應鍊

答: 事件響應鍊。包括點選事件,畫面重新整理事件等。在視圖棧内從上至下,或者從下之上傳播。

可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了

嚴重懷疑題目出到越後面就越籠統。

可以從責任鍊模式,來講通過事件響應鍊處理,其擁有的擴充性

28. frame和bounds有什麼不同?

答:frame指的是:該view在父view坐标系統中的位置和大小。(參照點是父親的坐标系統)

bounds指的是:該view在本身坐标系統中 的位置和大小。(參照點是本身坐标系統)

29. 方法和選擇器有何不同?

答:selector是一個方法的名字,method是一個組合體,包含了名字和實作.

詳情可以看apple文檔。

30. OC的垃圾回收機制?

答: OC2.0有Garbage collection,但是iOS平台不提供。

一般我們了解的objective-c對于記憶體管理都是手動操作的,但是也有自動釋放池。

但是差了大部分資料,貌似不要和arc機制搞混就好了。

31. NSOperation queue?

答:存放NSOperation的集合類。

操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發的問題。

網上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現出。

這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,

但是Bfunc是等Afunc完全操作完以後,B才開始啟動并且執行,是以隊列的概念離亂上有點違背了多線程處理這個概念。

但是轉念一想其實可以參考銀行的取票和叫号系統。

是以對于A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。

但是後來看到一票關于這操作隊列話題的文章,其中有一句提到

“因為兩個操作送出的時間間隔很近,線程池中的線程,誰先啟動是不定的。”

瞬間覺得這個queue名字有點忽悠人了,還不如pool~

綜合一點,我們知道他可以比較大的用處在于可以幫組多線程程式設計就好了。

32. 什麼是延遲加載?

答:懶漢模式,隻在用到的時候才去初始化。

也可以了解成延時加載。

我覺得最好也最簡單的一個列子就是tableView中圖檔的加載顯示了。

一個延時載,避免記憶體過高,一個異步加載,避免線程堵塞。

33. 是否在一個視圖控制器中嵌入兩個tableview控制器?

答:一個視圖控制隻提供了一個View視圖,理論上一個tableViewController也不能放吧,

隻能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController那樣的感覺。

34. 一個tableView是否可以關聯兩個不同的資料源?你會怎麼處理?

答:首先我們從代碼來看,資料源如何關聯上的,其實是在資料源關聯的代理方法裡實作的。

是以我們并不關心如何去關聯他,他怎麼關聯上,方法隻是讓我傳回根據自己的需要去設定如相關的資料源。

是以,我覺得可以設定多個資料源啊,但是有個問題是,你這是想幹嘛呢?想讓清單如何顯示,不同的資料源分區塊顯示?

35. 什麼時候使用NSMutableArray,什麼時候使用NSArray?

答:當數組在程式運作時,需要不斷變化的,使用NSMutableArray,當數組在初始化後,便不再改變的,使用NSArray。需要指出的是,使用NSArray隻表明的是該數組在運作時不發生改變,即不能往NSAarry的數組裡新增和删除元素,但不表明其數組內的元素的内容不能發生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意。

36. 給出委托方法的執行個體,并且說出UITableVIew的Data Source方法

答:CocoaTouch架構中用到了大量委托,其中UITableViewDelegate就是委托機制的典型應用,是一個典型的使用委托來實作擴充卡模式,其中UITableViewDelegate協定是目标,tableview是擴充卡,實作UITableViewDelegate協定,并将自身設定為talbeview的delegate的對象,是被擴充卡,一般情況下該對象是UITableViewController。

UITableVIew的Data Source方法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

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

37. 在應用中可以建立多少autorelease對象,是否有限制?

答案:無

38. 如果我們不建立記憶體池,是否有記憶體池提供給我們?

答:界面線程維護着自己的記憶體池,使用者自己建立的資料線程,則需要建立該線程的記憶體池

39. 什麼時候需要在程式中建立記憶體池?

答:使用者自己建立的資料線程,則需要建立該線程的記憶體池

40. 類NSObject的那些方法經常被使用?

答:NSObject是Objetive-C的基類,其由NSObject類及一系列協定構成。

其中類方法alloc、class、 description 對象方法init、dealloc、– performSelector:withObject:afterDelay:等經常被使用

41. 什麼是簡便構造方法?

答:簡便構造方法一般由CocoaTouch架構提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:

Foundation下大部分類均有簡便構造方法,我們可以通過簡便構造方法,獲得系統給我們建立好的對象,并且不需要手動釋放。

42. 如何使用Xcode設計通用應用?

答:使用MVC模式設計應用,其中Model層完成脫離界面,即在Model層,其是可運作在任何裝置上,在controller層,根據iPhone與iPad(獨有UISplitViewController)的不同特點選擇不同的viewController對象。在View層,可根據現實要求,來設計,其中以xib檔案設計時,其設定其為universal。

43. UIView的動畫效果有那些?

答:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown

44. 在iPhone應用中如何儲存資料?

答:有以下幾種儲存機制:

1).通過web服務,儲存在伺服器上

2).通過NSCoder固化機制,将對象儲存在檔案中

3).通過SQlite或CoreData儲存在檔案資料庫中

45. 什麼是coredata?

答:coredata是蘋果提供一套資料儲存架構,其基于SQlite

46. 什麼是NSManagedObject模型?

答:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實作了core data 模型層所需的基本功能,使用者可通過子類化NSManagedObject,建立自己的資料模型。

47. 什麼是NSManagedobjectContext?

答:NSManagedobjectContext對象負責應用和資料庫之間的互動。

48. 什麼是謂詞?

答:謂詞是通過NSPredicate,是通過給定的邏輯條件作為限制條件,完成對資料的篩選。

predicate?=?[NSPredicate?predicateWithFormat:@"customerID?==?%d",n];
a?=?[customers?filteredArrayUsingPredicate:predicate];      

49. 和coredata一起有哪幾種持久化存儲機制?

答:存入到檔案、 存入到NSUserDefaults(系統plist檔案中)、存入到Sqlite檔案資料庫

50. 談談對Block 的了解?并寫出一個使用Block執行UIVew動畫?

答:Block是可以擷取其他函數局部變量的匿名函數,其不但友善開發,并且可以大幅提高應用的執行效率(多核心CPU可直接處理Block指令)

[UIView?transitionWithView:self.view
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{?[[blueViewController?view]?removeFromSuperview];?[[self?view]?insertSubview:yellowViewController.view?atIndex:0];?}
completion:NULL];      

51. 寫出上面代碼的Block的定義。

答:

typedef?void(^animations)?(void);
typedef?void(^completion)?(BOOL?finished);      

52. 試着使用+ beginAnimations:context:以及上述Block的定義,寫出一個可以完成

+?(void)transitionWithView:(UIView?*)view?duration:(NSTimeInterval)duration?options:(UIViewAnimationOptions)options?animations:(void?(^)(void))animations?completion:(void?(^)(BOOL?finished))completion?NS_AVAILABLE_IOS(4_0);      

操作的函數執行部分

答案:無

53. 做過的項目是否涉及網絡通路功能,使用什麼對象完成網絡功能?

答:ASIHTTPRequest與NSURLConnection

54. 簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的差別?

答: NSURLConnection主要用于網絡通路,其中+ sendSynchronousRequest:returningResponse:error:是同步通路資料,即目前線程會阻塞,并等待request的傳回的response,而– initWithRequest:delegate:使用的是異步加載,當其完成網絡通路後,會通過delegate回到主線程,并其委托的對象。

55. 多線程是什麼

答: 多線程是個複雜的概念,按字面意思是同步完成多項任務,提高了資源的使用效率,從硬體、作業系統、應用軟體不同的角度去看,多線程被賦予不同的内涵,對于硬體,現在市面上多數的CPU都是多核的,多核的CPU運算多線程更為出色;從作業系統角度,是多任務,現在用的主流作業系統都是多任務的,可以一邊聽歌、一邊寫部落格;對于應用來說,多線程可以讓應用有更快的回應,可以在網絡下載下傳時,同時響應使用者的觸摸操作。在iOS應用中,對多線程最初的了解,就是并發,它的含義是原來先做燒水,再摘菜,再炒菜的工作,會變成燒水的同時去摘菜,最後去炒菜。

56. iOS 中的多線程

答: iOS中的多線程,是Cocoa架構下的多線程,通過Cocoa的封裝,可以讓我們更為友善的使用線程,做過C++的同學可能會對線程有更多的了解,比如線程的創立,信号量、共享變量有認識,Cocoa架構下會友善很多,它對線程做了封裝,有些封裝,可以讓我們建立的對象,本身便擁有線程,也就是線程的對象化抽象,進而減少我們的工程,提供程式的健壯性。

GCD是(Grand Central Dispatch)的縮寫 ,從系統級别提供的一個易用地多線程類庫,具有運作時的特點,能充分利用多核心硬體。GCD的API接口為C語言的函數,函數參數中多數有Block,關于Block的使用參看這裡,為我們提供強大的“接口”,對于GCD的使用參見本文

NSOperation與Queue

NSOperation是一個抽象類,它封裝了線程的細節實作,我們可以通過子類化該對象,加上NSQueue來同面向對象的思維,管理多線程程式。具體可參看這裡:一個基于NSOperation的多線程網絡通路的項目。

NSThread

NSThread是一個控制線程執行的對象,它不如NSOperation抽象,通過它我們可以友善的得到一個線程,并控制它。但NSThread的線程之間的并發控制,是需要我們自己來控制的,可以通過NSCondition實作。

參看 iOS多線程程式設計之NSThread的使用

其他多線程

在Cocoa的架構下,通知、Timer和異步函數等都有使用多線程,(待補充).

57. 在項目什麼時候選擇使用GCD,什麼時候選擇NSOperation?

答: 項目中使用NSOperation的優點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程式結構更好,子類化NSOperation的設計思路,是具有面向對象的優點(複用、封裝),使得實作是多線程支援,而接口簡單,建議在複雜項目中使用。

項目中使用GCD的優點是GCD本身非常簡單、易用,對于不複雜的多線程操作,會節省代碼量,而Block參數的使用,會是代碼更為易讀,建議在簡單項目中使用。

58. 什麼是block

答: 對于閉包(block),有很多定義,其中閉包就是能夠讀取其它函數内部變量的函數,這個定義即接近本質又較好了解。對于剛接觸Block的同學,會覺得有些繞,因為我們習慣寫這樣的程式main(){ funA();} funA(){funB();} funB(){…..}; 就是函數main調用函數A,函數A調用函數B… 函數們依次順序執行,但現實中不全是這樣的,例如項目經理M,手下有3個程式員A、B、C,當他給程式員A安排實作功能F1時,他并不等着A完成之後,再去安排B去實作F2,而是安排給A功能F1,B功能F2,C功能F3,然後可能去寫技術文檔,而當A遇到問題時,他會來找項目經理M,當B做完時,會通知M,這就是一個異步執行的例子。在這種情形下,Block便可大顯身手,因為在項目經理M,給A安排工作時,同時會告訴A若果遇到困難,如何能找到他報告問題(例如打他手機号),這就是項目經理M給A的一個回調接口,要回掉的操作,比如接到電話,百度查詢後,傳回網頁内容給A,這就是一個Block,在M交待工作時,已經定義好,并且取得了F1的任務号(局部變量),卻是在當A遇到問題時,才調用執行,跨函數在項目經理M查詢百度,獲得結果後回調該block。

59. block 實作原理

答: Objective-C是對C語言的擴充,block的實作是基于指針和函數指針。

從計算語言的發展,最早的goto,進階語言的指針,到面向對象語言的block,從機器的思維,一步步接近人的思維,以友善開發人員更為高效、直接的描述出現實的邏輯(需求)。

使用執行個體

cocoaTouch架構下動畫效果的Block的調用

使用typed聲明block

typedef?void(^didFinishBlock)?(NSObject?*ob);
這就聲明了一個didFinishBlock類型的block,      

然後便可用

@property?(nonatomic,copy)?didFinishBlock?finishBlock;      

聲明一個blokc對象,注意對象屬性設定為copy,接到block 參數時,便會自動複制一份。

__block是一種特殊類型,

使用該關鍵字聲明的局部變量,可以被block所改變,并且其在原函數中的值會被改變。

60.關于block

答: 面試時,面試官會先問一些,是否了解block,是否使用過block,這些問題相當于開場白,往往是下面一系列問題的開始,是以一定要如實根據自己的情況回答。

1). 使用block和使用delegate完成委托模式有什麼優點?

首先要了解什麼是委托模式,委托模式在iOS中大量應用,其在設計模式中是擴充卡模式中的對象擴充卡,Objective-C中使用id類型指向一切對象,使委托模式更為簡潔。了解委托模式的細節:

iOS設計模式—-委托模式

使用block實作委托模式,其優點是回調的block代碼塊定義在委托對象函數内部,使代碼更為緊湊;

适配對象不再需要實作具體某個protocol,代碼更為簡潔。

2). 多線程與block

GCD與Block

使用 dispatch_async 系列方法,可以以指定的方式執行block

GCD程式設計執行個體

dispatch_async的完整定義

void?dispatch_async(
dispatch_queue_t?queue,
dispatch_block_t?block);      

功能:在指定的隊列裡送出一個異步執行的block,不阻塞目前線程

通過queue來控制block執行的線程。主線程執行前文定義的 finishBlock對象

dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});      

62.談談Object-C的記憶體管理方式及過程?

答: 1).當你使用new,alloc和copy方法建立一個對象時,該對象的保留計數器值為1.當你不再使用該對象時,你要負責向該對象發送一條release或autorelease消息.這樣,該對象将在使用壽命結束時被銷毀.

2).當你通過任何其他方法獲得一個對象時,則假設該對象的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確定該對象被清理.如果你打算在一段時間内擁有該對象,則需要保留它并確定在操作完成時釋放它.

3).如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數相等.

63.Object-C有私有方法嗎?私有變量呢?

答: objective-c – 類裡面的方法隻有兩種, 靜态方法和執行個體方法. 這似乎就不是完整的面向對象了,按照OO的原則就是一個對象隻暴露有用的東西. 如果沒有了私有方法的話, 對于一些小範圍的代碼重用就不那麼順手了. 在類裡面聲名一個私有方法

@interface?Controller?:?NSObject?{?NSString?*something;?}
+?(void)thisIsAStaticMethod;
–?(void)thisIsAnInstanceMethod;
@end
@interface?Controller?(private)?-
(void)thisIsAPrivateMethod;
@end      

@private可以用來修飾私有變量

在Objective‐C中,所有執行個體變量預設都是私有的,所有執行個體方法預設都是公有的

64.Object-C有多繼承嗎?沒有的話用什麼代替?cocoa 中所有的類都是NSObject 的子類

答: 多繼承在這裡是用protocol 委托代理 來實作的

你不用去考慮繁瑣的多繼承 ,虛基類的概念.

ood的多态特性 在 obj-c 中通過委托來實作.

65.記憶體管理 Autorelease、retain、copy、assign的set方法和含義?

答: 1).你初始化(alloc/init)的對象,你需要釋放(release)它。例如:

NSMutableArray aArray = [[NSArray alloc] init]; 後,需要 [aArray release];

2).你retain或copy的,你需要釋放它。例如:

[aArray retain] 後,需要 [aArray release];

3).被傳遞(assign)的對象,你需要斟酌的retain和release。例如:

obj2 = [[obj1 someMethod] autorelease];

對象2接收對象1的一個自動釋放的值,或傳遞一個基本資料類型(NSInteger,NSString)時:你或希望将對象2進行retain,以防止它在被使用之前就被自動釋放掉。但是在retain後,一定要在适當的時候進行釋放。

關于索引計數(Reference Counting)的問題

retain值 = 索引計數(Reference Counting)

NSArray對象會retain(retain值加一)任何數組中的對象。當NSArray被解除安裝(dealloc)的時候,所有數組中的對象會 被 執行一次釋放(retain值減一)。不僅僅是NSArray,任何收集類(Collection Classes)都執行類似操作。例如 NSDictionary,甚至UINavigationController。

Alloc/init建立的對象,索引計數為1。無需将其再次retain。

[NSArray array]和[NSDate date]等“方法”建立一個索引計數為1的對象,但是也是一個自動釋放對象。是以是本地臨時對象,那麼無所謂了。如果是打算在全Class中使用的變量(iVar),則必須retain它。

預設的類方法傳回值都被執行了“自動釋放”方法。(*如上中的NSArray)

在類中的解除安裝方法“dealloc”中,release所有未被平衡的NS對象。(*所有未被autorelease,而retain值為1的)

66. C和obj-c 如何混用

答: 1).obj-c的編譯器處理字尾為m的檔案時,可以識别obj-c和c的代碼,處理mm檔案可以識别obj-c,c,c++代碼,但cpp檔案必須隻能用c/c++代碼,而且cpp檔案include的頭檔案中,也不能出現obj-c的代碼,因為cpp隻是cpp

2).在mm檔案中混用cpp直接使用即可,是以obj-c混cpp不是問題

3).在cpp中混用obj-c其實就是使用obj-c編寫的子產品是我們想要的。

如果子產品以類實作,那麼要按照cpp class的标準寫類的定義,頭檔案中不能出現obj-c的東西,包括#import cocoa的。實作檔案中,即類的實作代碼中可以使用obj-c的東西,可以import,隻是字尾是mm。

如果子產品以函數實作,那麼頭檔案要按c的格式聲明函數,實作檔案中,c++函數内部可以用obj-c,但字尾還是mm或m。

總結:隻要cpp檔案和cpp include的檔案中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用 實作代 碼,實際上cpp混用的是obj-c編譯後的o檔案,這個東西其實是無差别的,是以可以用。obj-c的編譯器支援cpp

67. Objective-C堆和棧的差別?

答: 管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程式員控制,容易産生memory leak。

申請大小:

棧:在Windows下,棧是向低位址擴充的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就确定的常數),如果申請的空間超過棧的剩餘空間時,将提示overflow。因 此,能從棧獲得的空間較小。

堆:堆是向高位址擴充的資料結構,是不連續的記憶體區域。這是由于系統是用連結清單來存儲的空閑記憶體位址的,自然是不連續的,而連結清單的周遊方向是由低位址向高位址。堆的大小受限于計算機系統中有效的虛拟記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

碎片問題:對于堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,進而造成大量的碎片,使程式效率降低。對于棧來講,則不會存在這個問題,因為棧是先進後出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個記憶體塊從棧中間彈出

配置設定方式:堆都是動态配置設定的,沒有靜态配置設定的堆。棧有2種配置設定方式:靜态配置設定和動态配置設定。靜态配置設定是編譯器完成的,比如局部變量的配置設定。動态配置設定由alloca函數進行配置設定,但是棧的動态配置設定和堆是不同的,他的動态配置設定是由編譯器進行釋放,無需我們手工實作。

配置設定效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:配置設定專門的寄存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

68. ViewController的didReceiveMemoryWarning怎麼被調用:

答:[supper didReceiveMemoryWarning];

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

答: delegate針對one-to-one關系,用于sender接受到reciever的某個功能回報值。

notification針對one-to-one/many/none,reciver,用于通知多個object某個事件。

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

答:

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在這想看到幾件事情:

#define 文法的基本知識(例如:不能以分号結束,括号的使用,等等)

懂得預處理器将為你計算常數表達式的值,是以,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

意識到這個表達式将使一個16位機的整型數溢出-是以要用到長整型符号L,告訴編譯器這個常數是的長整型數。

如果你在你的表達式中用到UL(表示無符号長整型),那麼你有了一個好的起點。記住,第一印象很重要。

71.寫一個”标準"宏MIN ,這個宏輸入兩個參數并傳回較小的一個。

答:

#define?MIN(A,B)?((A)?<=?(B)???(A)?:?(B))      

這個測試是為下面的目的而設的:

辨別#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為标準C的一部分,宏是友善産生嵌入代碼的唯一方

法,

對于嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。

三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能産生比 if-then-else 更優化的代碼,了解這個用法是很重要的。

懂得在宏中小心地把參數用括号括起來

我也用這個問題開始讨論宏的副作用,例如:當你寫下面的代碼時會發生什麼事?

least?=?MIN(*p++,?b);      

結果是:

((*p++)?<=?(b)???(*p++)?:?(*p++))      

這個表達式會産生副作用,指針p會作三次++自增操作。

72.關鍵字const有什麼含意?修飾類呢?static的作用,用于類呢?還有extern c的作用

答:

const 意味着"隻讀",下面的聲明都是什麼意思?

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

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

第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。

第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。

最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。

結論:

關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊,實際上,聲明一個參數為常量是為了告訴了使用者這個參數的應用目的。

如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式員很少會留下的垃圾讓别人來清理的) ?通過給優化器一些附加的資訊,使用關鍵字const也許能産生更緊湊的代碼。合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

1).欲阻止一個變量被改變,可以使用 const 關鍵字。在定義該 const 變量時,通常需要對它進行初

始化,因為以後就沒有機會再去改變它了;

2).對指針來說,可以指定指針本身為 const,也可以指定指針所指的資料為 const,或二者同時指

定為 const;

3).在一個函數聲明中,const 可以修飾形參,表明它是一個輸入參數,在函數内部不能改變其值;

4).對于類的成員函數,若指定其為 const 類型,則表明其是一個常函數,不能修改類的成員變量;

5).對于類的成員函數,有時候必須指定其傳回值為 const 類型,以使得其傳回值不為“左值”。

73. 關鍵字volatile有什麼含意?并給出三個不同的例子。

答:一個定義為 volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精确地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用儲存在寄存器裡的備份。

下面是volatile變量的幾個例子:

并行裝置的硬體寄存器(如:狀态寄存器)

一個中斷服務子程式中會通路到的非自動變量(Non-automatic variables)

多線程應用中被幾個任務共享的變量

74. 一個參數既可以是const還可以是volatile嗎? 一個指針可以是volatile 嗎?解釋為什麼。

答:1).是的。一個例子是隻讀的狀态寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。

2).是的。盡管這并不很常見。一個例子是當一個中服務子程式修該一個指向一個buffer的指針時。

75 . static 關鍵字的作用:

答:

1).函數體内 static 變量的作用範圍為該函數體,不同于 auto 變量,該變量的記憶體隻被配置設定一次,

是以其值在下次調用時仍維持上次的值;

2).在子產品内的 static 全局變量可以被子產品内所用函數通路,但不能被子產品外其它函數通路;

3).在子產品内的 static 函數隻可被這一子產品内的其它函數調用,這個函數的使用範圍被限制在聲明

它的子產品内;

4).在類中的 static 成員變量屬于整個類所擁有,對類的所有對象隻有一份拷貝;

5).在類中的 static 成員函數屬于整個類所擁有,這個函數不接收 this 指針,因而隻能通路類的static 成員變量。

76. 線程與程序的差別和聯系?

答:

1). 程序和線程都是由作業系統所體會的程式運作的基本單元,系統利用該基本單元實作系統對應用的并發性

2). 程序和線程的主要差别在于它們是不同的作業系統資源管理方式。

3). 程序有獨立的位址空間,一個程序崩潰後,在保護模式下不會對其它程序産生影響,而線程隻是一個程序中的不同執行路徑。

4.)線程有自己的堆棧和局部變量,但線程之間沒有單獨的位址空間,一個線程死掉就等于整個程序死掉。是以多程序的程式要比多線程的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。

5). 但對于一些要求同時進行并且又要共享某些變量的并發操作,隻能用線程,不能用程序。

77. 列舉幾種程序的同步機制,并比較其優缺點。

答: 原子操作 ?信号量機制 ? ?自旋鎖 ? ?管程,會合,分布式系統

78. 程序之間通信的途徑

答:共享存儲系統消息傳遞系統管道:以檔案系統為基礎

79. 程序死鎖的原因

答:資源競争及程序推進順序非法

80. 死鎖的4個必要條件

答:互斥、請求保持、不可剝奪、環路

81. 死鎖的處理

答:鴕鳥政策、預防政策、避免政策、檢測與解除死鎖

82. cocoa touch架構

答:iPhone OS 應用程式的基礎 Cocoa Touch 架構重用了許多 Mac 系統的成熟模式,但是它更多地專注于觸摸的接口和優化。

UIKit 為您提供了在 iPhone OS 上實作圖形,事件驅動程式的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 架構上,包括檔案處理,網絡,字元串操作等。

Cocoa Touch 具有和 iPhone 使用者接口一緻的特殊設計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點觸摸手勢來控制您的應用。

各色俱全的架構 除了UIKit 外,Cocoa Touch 包含了建立世界一流 iPhone 應用程式需要的所有架構,從三維圖形,到專業音效,甚至提供裝置通路 API 以控制攝像頭,或通過 GPS 獲知目前位置。

Cocoa Touch 既包含隻需要幾行代碼就可以完成全部任務的強大的 Objective-C 架構,也在需要時提供基礎的 C 語言 API 來直接通路系統。這些架構包括:

Core Animation:通過 Core Animation,您就可以通過一個基于組合獨立圖層的簡單的程式設計模型來建立豐富的使用者體驗。

Core Audio:Core Audio 是播放,處理和錄制音頻的專業技術,能夠輕松為您的應用程式添加強大的音頻功能。

Core Data:提供了一個面向對象的資料管了解決方案,它易于使用和了解,甚至可處理任何應用或大或小的資料模型。

功能清單:架構分類

下面是 Cocoa Touch 中一小部分可用的架構:

音頻和視訊:Core Audio ,OpenAL ,Media Library ,AV Foundation

資料管理 :Core Data ,SQLite

圖形和動畫 :Core Animation ,OpenGL ES ,Quartz 2D

網絡:Bonjour ,WebKit ,BSD Sockets

使用者應用:Address Book ,Core Location ,Map Kit ,Store Kit

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

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

84. Objective-C的優缺點。

答:objc優點:

1). ?Cateogies

2). ?Posing

3). 動态識别

4).名額計算

5).彈性訊息傳遞

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

7).Objective-C 與 C++ 可混合程式設計

objc缺點:

1).不支援命名空間

2).不支援運算符重載

3).不支援多重繼承

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

85. sprintf,strcpy,memcpy使用上有什麼要注意的地方。

答:

1). sprintf是格式化函數。将一段資料通過特定的格式,格式化到一個字元串緩沖區中去。sprintf格式化的函數的長度不可控,有可能格式化後的字元串會超出緩沖區的大小,造成溢出。

2).strcpy是一個字元串拷貝的函數,它的函數原型為strcpy(char *dst, const char *src

将src開始的一段字元串拷貝到dst開始的記憶體中去,結束的标志符号為 ‘\0',由于拷貝的長度不是由我們自己控制的,是以這個字元串拷貝很容易出錯。

3). memcpy是具備字元串拷貝功能的函數,這是一個記憶體拷貝函數,它的函數原型為memcpy(char *dst, const char* src, unsigned int len);将長度為len的一段記憶體,從src拷貝到dst中去,這個函數的長度可控。但是會有記憶體疊加的問題。

86. readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用

答:@property是一個屬性通路聲明,擴号内支援以下幾個屬性:

1).getter=getterName,setter=setterName,設定setter與 getter的方法名

2).readwrite,readonly,設定可供通路級别

2).assign,setter方法直接指派,不進行任何retain操作,為了解決原類型與環循引用問題

3).retain,setter方法對參數進行release舊值再retain新值,所有實作都是這個順序(CC上有相關資料)

4).copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。

5).nonatomic,非原子性通路,不加同步,多線程并發通路會提高性能。注意,如果不加此屬性,則預設是兩個通路方法都為原子型事務通路。鎖被加到所屬對象執行個體級。

87. http和scoket通信的差別。

答: http是用戶端用http協定進行請求,發送請求時候需要封裝http請求頭,并綁定請求的資料,伺服器一般有web伺服器配合(當然也非絕對)。 http請求方式為用戶端主動發起請求,伺服器才能給響應,一次請求完畢後則斷開連接配接,以節省資源。伺服器不能主動給用戶端響應(除非采取http長連接配接 技術)。iphone主要使用類是NSUrlConnection。

scoket是用戶端跟伺服器直接使用socket“套接字”進行連接配接,并沒有規定連接配接後斷開,是以用戶端和伺服器可以保持連接配接通道,雙方 都可以主動發送資料。一般在遊戲開發或股票開發這種要求即時性很強并且保持發送資料量比較大的場合使用。主要使用類是CFSocketRef。

88. TCP和UDP的差別

答: TCP全稱是Transmission Control Protocol,中文名為傳輸控制協定,它可以提供可靠的、面向連接配接的網絡資料傳遞服務。傳輸控制協定主要包含下列任務和功能:

* 確定IP資料報的成功傳遞。

* 對程式發送的大塊資料進行分段和重組。

* 確定正确排序及按順序傳遞分段的資料。

* 通過計算校驗和,進行傳輸資料的完整性檢查。

TCP提供的是面向連接配接的、可靠的資料流傳輸,而UDP提供的是非面向連接配接的、不可靠的資料流傳輸。

簡單的說,TCP注重資料安全,而UDP資料傳輸快點,但安全性一般

89. 你了解svn,cvs等版本控制工具麼?

答: 版本控制 svn,cvs 是兩種版控制的器,需要配套相關的svn,cvs伺服器。

scm是xcode裡配置版本控制的地方。版本控制的原理就是a和b同時開發一個項目,a寫完當天的代碼之後把代碼送出給伺服器,b要做的時候先從伺服器得到最新版本,就可以接着做。 如果a和b都要送出給伺服器,并且同時修改了同一個方法,就會産生代碼沖突,如果a先送出,那麼b送出時,伺服器可以提示沖突的代碼,b可以清晰的看到,并做出相應的修改或融合後再送出到伺服器。

90. 什麼是push。

答: 用戶端程式留下後門端口,用戶端總是監聽針對這個後門的請求,于是 伺服器可以主動像這個端口推送消息。

91. 靜态連結庫

答:此為.a檔案,相當于java裡的jar包,把一些類編譯到一個包中,在不同的工程中如果導入此檔案就可以使用裡面的類,具體使用依然是#import “ xx.h”。

92. fmmpeg架構

答: 音視訊編解碼架構,内部使用UDP協定針對流媒體開發,内部開辟了六個端口來接受流媒體資料,完成快速接受之目的。

93. fmdb架構

答:資料庫架構,對sqllite的資料操作進行了封裝,使用着可把精力都放在sql語句上面。

94. 320架構

答: ui架構,導入320工程作為架構包如同添加一個普通架構一樣。cover(open) ?flower架構 (2d 仿射技術),内部核心類是CATransform3D.

94. 什麼是沙盒模型?哪些操作是屬于私有api範疇?

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

iphone沙箱模型的有四個檔案夾documents,tmp,app,Library,永久資料存儲一般放documents檔案夾,得到模拟器的路徑的可使用NSHomeDirectory()方法。Nsuserdefaults儲存的檔案在tmp檔案夾裡。

95. 在一個對象的方法裡面:self.name= “object”;和 name =”object” 有什麼不同嗎?

答:self.name =”object”:會調用對象的setName()方法;

name = “object”:會直接把object指派給目前對象的name屬性。

96. 請簡要說明viewDidLoad和viewDidUnload何時調用

答:viewDidLoad在view從nib檔案初始化時調用,loadView在controller的view為nil時調用。此方法在程式設計實作view時調用,view控制器預設會注冊memory warning notification,當view controller的任何view沒有用的時候,viewDidUnload會被調用,在這裡實作将retain的view release,如果是retain的IBOutlet view 屬性則不要在這裡release,IBOutlet會負責release 。

97. 簡述記憶體分區情況

答:

1).代碼區:存放函數二進制代碼

2).資料區:系統運作時申請記憶體并初始化,系統退出時由系統釋放。存放全局變量、靜态變量、常量

3).堆區:通過malloc等函數或new等操作符動态申請得到,需程式員手動申請和釋放

4).棧區:函數子產品内申請,函數結束時由系統自動釋放。存放局部變量、函數參數

98. 隊列和棧有什麼差別:

答:隊列和棧是兩種不同的資料容器。從”資料結構”的角度看,它們都是線性結構,即資料元素之間的關系相同。

隊列是一種先進先出的資料結構,它在兩端進行操作,一端進行入隊列操作,一端進行出列隊操作。

棧是一種先進後出的資料結構,它隻能在棧頂進行操作,入棧和出棧都在棧頂操作。

99. HTTP協定中,POST和GET的差別是什麼?

答:

1).GET 方法

GET 方法送出資料不安全,資料置于請求行,用戶端位址欄可見;

GET 方法送出的資料大小有限

GET 方法不可以設定書簽

2).POST 方法

POST 方法送出資料安全,資料置于消息主體内,用戶端不可見

POST 方法送出的資料大小沒有限制

POST 方法可以設定書簽

100. ?iOS的系統架構

答: iOS的系統架構分為( 核心作業系統層 theCore OS layer )、( 核心服務層theCore Services layer )、( 媒體層 theMedia layer )和( Cocoa 界面服務層 the Cocoa Touch layer )四個層次。

101. ?控件主要響應3種事件

答:1). 基于觸摸的事件 ; ?2). 基于值的事件 ; ?3).基于編輯的事件。

102. ?xib檔案的構成分為哪3個圖示?都具有什麼功能。

答: File’s Owner 是所有 nib 檔案中的每個圖示,它表示從磁盤加載 nib 檔案的對象;

First Responder 就是使用者目前正在與之互動的對象;

View 顯示使用者界面;完成使用者互動;是 UIView 類或其子類。

103. ?簡述視圖控件器的生命周期。

答: loadView 盡管不直接調用該方法,如多手動建立自己的視圖,那麼應該覆寫這個方法并将它們指派給試圖控制器的 view 屬性。

viewDidLoad 隻有在視圖控制器将其視圖載入到記憶體之後才調用該方法,這是執行任何其他初始化操作的入口。

viewDidUnload 當試圖控制器從記憶體釋放自己的方法的時候調用,用于清楚那些可能已經在試圖控制器中建立的對象。

viewVillAppear 當試圖将要添加到視窗中并且還不可見的時候或者上層視圖移出圖層後本視圖變成頂級視圖時調用該方法,用于執行諸如改變視圖方向等的操作。實作該方法時確定調用 [super viewWillAppear:

viewDidAppear 當視圖添加到視窗中以後或者上層視圖移出圖層後本視圖變成頂級視圖時調用,用于放置那些需要在視圖顯示後執行的代碼。確定調用 [super viewDidAppear:] 。

104. ?動畫有基本類型有哪幾種;表視圖有哪幾種基本樣式。

答:動畫有兩種基本類型:隐式動畫和顯式動畫。

105. ?實作簡單的表格顯示需要設定UITableView的什麼屬性、實作什麼協定?

答:實作簡單的表格顯示需要設定 UITableView 的 dataSource 和 delegate 屬性,實作UITableViewDataSource 和 UITableViewDelegate 協定。

106. ?Cocoa Touch提供了哪幾種Core Animation過渡類型?

答: Cocoa Touch 提供了 4 種 Core Animation 過渡類型,分别為:交叉淡化、推擠、顯示和覆寫。

107. ?UIView與CLayer有什麼差別?

答:

1).UIView 是 iOS 系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由 CoreAnimation 來實作的。它真正的繪圖部分,是由一個 CALayer 類來管理。 UIView 本身更像是一個 CALayer 的管理器,通路它的跟繪圖和跟坐标有關的屬性。

2).UIView 有個重要屬性 layer ,可以傳回它的主 CALayer 執行個體。

3).UIView 的 CALayer 類似 UIView 的子 View 樹形結構,也可以向它的 layer 上添加子layer ,來完成某些特殊的表示。即 CALayer 層是可以嵌套的。

4).UIView 的 layer 樹形在系統内部,被維護着三份 copy 。分别是邏輯樹,這裡是代碼可以操縱的;動畫樹,是一個中間層,系統就在這一層上更改屬性,進行各種渲染操作;顯示樹,其内容就是目前正被顯示在螢幕上得内容。

5).動畫的運作:對 UIView 的 subLayer (非主 Layer )屬性進行更改,系統将自動進行動畫生成,動畫持續時間的預設值似乎是 0.5 秒。

6).坐标系統: CALayer 的坐标系統比 UIView 多了一個 anchorPoint 屬性,使用CGPoint 結構表示,值域是 0~1 ,是個比例值。這個點是各種圖形變換的坐标原點,同時會更改 layer 的 position 的位置,它的預設值是 {0.5,0.5} ,即在 layer 的中央。

7).渲染:當更新層,改變不能立即顯示在螢幕上。當所有的層都準備好時,可以調用setNeedsDisplay 方法來重繪顯示。

8).變換:要在一個層中添加一個 3D 或仿射變換,可以分别設定層的 transform 或affineTransform 屬性。

9).變形: Quartz Core 的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個三維坐标系中以任意角度被旋轉,縮放和傾斜。 CATransform3D 的一套方法提供了一些魔術般的變換效果。

108. Quatrz 2D的繪圖功能的三個核心概念是什麼并簡述其作用。

答:上下文:主要用于描述圖形寫入哪裡;

路徑:是在圖層上繪制的内容;

狀态:用于儲存配置變換的值、填充和輪廓, alpha 值等。

109. ?iPhone OS主要提供了幾種播放音頻的方法?

答: SystemSound Services

AVAudioPlayer 類

Audio Queue Services

OpenAL

110. ?使用AVAudioPlayer類調用哪個架構、使用步驟?

答: AVFoundation.framework

步驟:配置 AVAudioPlayer 對象;

實作 AVAudioPlayer 類的委托方法;

控制 AVAudioPlayer 類的對象;

監控音量水準;

回放進度和拖拽播放。

111. ?有哪幾種手勢通知方法、寫清楚方法名?

答:

-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;

-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;

-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;

-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;

112. ?CFSocket使用有哪幾個步驟。

答:建立 Socket 的上下文;建立 Socket ;配置要通路的伺服器資訊;封裝伺服器資訊;連接配接伺服器;

113. ?Core Foundation中提供了哪幾種操作Socket的方法?

答: CFNetwork 、 CFSocket 和 BSD Socket 。

114. ?解析XML檔案有哪幾種方式?

答:以 DOM 方式解析 XML 檔案;以 SAX 方式解析 XML 檔案;

115. ios 平台怎麼做資料的持久化?coredata 和sqlite有無必然聯系?coredata是一個關系型資料庫嗎?

答:iOS 中可以有四種持久化資料的方式:屬性清單(plist)、對象歸檔、 SQLite3 和 Core Data; core data 可以使你以圖形界面的方式快速的定義 app 的資料模型,同時在你的代碼中容易擷取到它。 coredata 提供了基礎結構去處理常用的功能,例如儲存,恢複,撤銷和重做,允許你在 app 中繼續建立新的任務。在使用 core data 的時候,你不用安裝額外的資料庫系統,因為 core data 使用内置的 sqlite 資料庫。 core data 将你 app 的模型層放入到一組定義在記憶體中的資料對象。 coredata 會追蹤這些對象的改變,同時可以根據需要做相反的改變,例如使用者執行撤銷指令。當 core data 在對你 app 資料的改變進行儲存的時候, core data 會把這些資料歸檔,并永久性儲存。 mac os x 中sqlite 庫,它是一個輕量級功能強大的關系資料引擎,也很容易嵌入到應用程式。可以在多個平台使用, sqlite 是一個輕量級的嵌入式 sql 資料庫程式設計。與 core data 架構不同的是, sqlite 是使用程式式的, sql 的主要的 API 來直接操作資料表。 Core Data 不是一個關系型資料庫,也不是關系型資料庫管理系統 (RDBMS) 。雖然 Core Dta 支援SQLite 作為一種存儲類型,但它不能使用任意的 SQLite 資料庫。 Core Data 在使用的過程種自己建立這個資料庫。 Core Data 支援對一、對多的關系。

116. ?tableView 的重用機制?

答:UITableView 通過重用單元格來達到節省記憶體的目的: 通過為每個單元格指定一個重用辨別符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出螢幕時,允許恢複單元格以便重用.對于不同種類的單元格使用不同的ID,對于簡單的表格,一個辨別符就夠了.