1. 程式人生 > >iOS 面試 + 筆試題

iOS 面試 + 筆試題

1.#import和#include的區別 @class?

@class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到,在m文 件中還是需要使用#import

而#import比起#include的好處就是不會引起交叉編譯

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

@property是 一個屬性訪問宣告,擴號內支援以下幾個屬性:
1,getter=getName,setter=setName,設定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,非原子性訪問,不加同步, 多執行緒併發訪問會提高效能。注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。鎖被加到所屬物件例項級(我是這麼理解的…)。

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

答:

self.name =”object”:會呼叫物件的setName()方法;

name = “object”:會直接把object賦值給當前物件的name屬性。

4.請簡述self.name= nil的機制,以及與[namerelease]的區別?

self.name =nil;   //使用nil引數呼叫setName:方法

[name release]生成的訪問器將自動釋放以前的name物件 

5.請簡要說明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 。

6.例項化一個UITableView物件,要求寫出關鍵語句?

答:UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];

my.delegate = self;

my.dataSource = self;

首先需要分配空間設定表格型別

然後需要設定兩個必須的委託物件。

7.使用sql語句查詢出省名以湖開頭,郵編為436001所在的市區?(5分)(表名及欄位名自定義)

select*fromcitys where postcode=436001 and province=’湖%’;

8.列印結果

main()

 { 

   int a[5]={1,2,3,4,5}; 

   int *ptr=(int *)(&a+1);  

   printf(“%d,%d”,*(a+1),*(ptr-1));

}

答:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
&a+1不是首地址+1,系統會認為加一個a陣列的偏 移,是偏移了一個數組的大小(本例是5個int)
int *ptr=(int *)(&a+1);
則ptr實際 是&(a[5]),也就是a+5
原因如下:

&a是陣列指標,其型別為 int (*)[5];
而 指標加1要根據指標型別加上一定的值,不同型別的指標+1之後增加的大小不同。
a是長度為5的int陣列指標,所以要加 5*sizeof(int)
所以ptr實際是a[5]
但是prt與(&a+1)型別是不一樣的(這點很重要)
所以prt-1只會減去sizeof(int*)

a,&a的地址是一樣的,但意思不一樣
a是陣列首地址,也就是a[0]的地址,&a是物件(陣列)首地址,
a+1是陣列下一元素的地址,即a[1],&a+1是下一個物件的地址,即a[5].

void Func ( char str[100] ) 

{   

sizeof(str ) = ? 

void*p = malloc( 100 ); sizeof( p ) = ?

這題 很常見了,Func ( char str[100] )函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是一個指標;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺下,指標的長度(佔用記憶體的大小)為4位元組,故sizeof( str ) 、sizeof( p ) 都為4。

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

答:#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在這想看到幾件事情:

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

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

意識到這個表示式將使一個16位機的整型數溢位-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。

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

10.寫一” 標準”巨集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會作三次++自增操作。 

11.陣列和指標的區別

(1)陣列可以申請在棧區和資料區;指標可以指向任意型別的記憶體塊

(2)sizeof作用於陣列時,得到的是陣列所佔的記憶體大小;作用於指標時,得到的都是4個位元組的大小

(3)陣列名錶示陣列首地址,值不可以改變,如不可以將++作用於陣列名上;普通指標的值可以改變,如可將++作用於指標上

(4)用字串初始化字元陣列是將字串的內容拷貝到字元陣列中;用字串初始化字元指標是將字串的首地址賦給指標,也就是指標指向了該陣列

12.static的作用

(1)函式體內static 變數的作用範圍為該函式體,不同於 auto 變數,該變數的記憶體只被分配一次,

因此其值在下次呼叫時仍維持上次的值;

(2)在模組內的static 全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;

(3)在模組內的static 函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告

它的模組內;

(4)在類中的static 成員變數屬於整個類所擁有,對類的所有物件只有一份拷貝;

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

13.簡述記憶體分割槽情況

(1)程式碼區:存放函式二進位制程式碼

(2)資料區:系統執行時申請記憶體並初始化,系統退出時由系統釋放。存放全域性變數、靜態變數、常量

(3)堆區:通過malloc等函式或new等操作符動態申請得到,需程式設計師手動申請和釋放

(4)棧區:函式模組內申請,函式結束時由系統自動釋放。存放區域性變數、函式引數

14.#include<filename>和#include”filename”有什麼區別

答:#include<filename>直接在庫檔案目錄中搜索所包含的檔案;#include”filename”在當前目錄下搜尋所包含的檔案,如果沒有的話再到庫檔案目錄搜尋。

15.const char *p;  charconst*p;  char*const p;  const char* const p;四個修飾指標有什麼區別

答: (1)定義了一個指向不可變的字串的字元指標

(2)和(1)一樣

(3)定義了一個指向字串的指標,該指標值不可改變,即不可改變指向

(4)定義了一個指向不可變的字串的字元指標,且該指標也不可改變指向

16.MVC的理解?

答:MVC模式考慮三種物件:模型物件、檢視物件和控制器物件。 模型物件負責應用程式的資料和定義操作資料的邏輯; 檢視物件知道如何顯示應用程式的模型資料; 控制器物件是M與V之間的協調者。

17.在Obj-c中有沒有私有方法?私有變數?一般採用什麼方法實現?

objective-c – 類裡面的方法只有兩種, 靜態方法和例項方法. 這似乎就不是完整的面向物件了,按照OO的原則就是一個物件只暴露有用的東西. 如果沒有了私有方法的話, 對於一些小範圍的程式碼重用就不那麼順手了. 在類裡面聲名一個私有方法

@interfaceController : NSObject { NSString *something; }

+(void)thisIsAStaticMethod;

-(void)thisIsAnInstanceMethod;

@end

@interfaceController (private)

-(void)thisIsAPrivateMethod;

@end

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

在Objective‐C中,所有例項變數預設都是私有的,所有例項方法預設都是公有的

18.OC中加號方法與減號的區別?

加號方法是類方法,屬於靜態方法

減號方法是例項方法必須由類的例項來呼叫

19.free與release的區別

20.在終端環境下,分別說明4,2,1,0對應的許可權是什麼

21.ARC機制

ARC就是automatic reference counting ,簡單說就是就是程式碼中自動加入了retain/release,原先需要手動新增的用來處理記憶體管理的引用計數的程式碼可以自動地由編譯器完成了。

使用ARC的好處

使用ARC有什麼好處呢?

看到上面的例子,大家就知道了,以後寫Objective-C的程式碼變得簡單多了,因為我們不需要擔心煩人的記憶體管理,擔心記憶體洩露了

程式碼的總量變少了,看上去清爽了不少,也節省了勞動力

程式碼高速化,由於使用編譯器管理引用計數,減少了低效程式碼的可能性

不好的地方

記住一堆新的ARC規則—關鍵字及特性等需要一定的學習週期

一些舊的程式碼,第三方程式碼使用的時候比較麻煩;修改程式碼需要工數,要麼修改編譯開關

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

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

1. ojc-c 是 通過一種”referring counting”(引用計數)的方式來管理記憶體的, 物件在開始分配記憶體(alloc)的時候引用計數為一,以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此物件的計數變為了0, 就會被系統銷燬.
2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.
3. autorelease和release沒什麼區別,只是引用計數減一的時機不同而已,autorelease會在物件的使用真正結束的時候才做引用計數減一.

23.ViewController 的 loadView, viewDidLoad,viewDidUnload 分別是在什麼時候呼叫的?在自定義ViewController的時候這幾個函式裡面應該做什麼工作?

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 。

24. 淺複製和深複製的區別?//淺拷貝和深拷貝

答案:

淺層複製(copy):只複製指向物件的指標,而不復制引用物件本身。//通過物件的指標來訪問這個物件

深層複製(mutableCopy):複製引用物件本身 意思就是有個A物件,複製一份後得到A_copy物件後,對於淺複製來說,A和A_copy指向的是同一個記憶體資源,複製的只不過是是一個指標,物件本身資源 還是隻有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的物件同樣被修改,這其實違背了我們複製拷貝的一個思想。深複製就好理解了,記憶體中存在了 兩份獨立物件本身。//當修改A時,A copy不變。

25. frame和bounds有什麼不同?

答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)//frame:框架、結構

bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)//bounds:界限 

26. obj-c的優缺點

答案:

objc優點:

1) Cateogies

2) Posing

3) 動態識別

4) 指標計算

5)彈性訊息傳遞

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

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

缺點:

1) 不支援名稱空間

2)  不支援運算子過載

3) 不支援多重繼承

4) 使用動態執行時型別,所有的方法都是函式呼叫,所以很多編譯時優化方法都用不到。(如行內函數等),效能低劣。

27.  用變數a給出下面的定義  

a) 一個整型數(An integer)   

b)一個指向整型數的指標( A pointer to aninteger)   

c)一個指向指標的的指標,它指向的指標是指向一個整型數( Apointer to a pointer to an intege)r   

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) 一個指向函式的指標,該函式有一個整型引數並返回一個整型數(Apointer to a function that takes an integer as an argument 

 andreturns an integer)   

h)一個有10個指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型數( An array of ten pointers to functions t 

hat takean integer argument and return an integer )  

答案是:

a) int a; // Aninteger

b) int *a; // A pointer to aninteger

c) int **a; // A pointer to apointer to an integer

d) int a[10]; // An array of10 integers

e) int *a[10]; // An array of10 pointers to integers

f) int (*a)[10]; // A pointerto an array of 10 integers

g) int (*a)(int); // A pointerto a function a that  takes an integer argument and returns aninteger

h) int (*a[10])(int); // Anarray of 10 pointers to functions  that take an integer argument andreturn an integer

28. 寫出幾個死迴圈?

29. 佇列和棧有什麼區別:

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

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

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

30.HTTP協議中,POST和GET的區別是什麼?

答案:1.GET 方法

GET 方法提交資料不安全,資料置於請求行,客戶端位址列可見;

GET 方法提交的資料大小有限

GET 方法不可以設定書籤

2.POST 方法

POST 方法提交資料安全,資料置於訊息主體內,客戶端不可見

POST 方法提交的資料大小沒有限制

POST 方法可以設定書籤

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

32.  控制元件主要響應3種事件:( 基於觸控的事件 )、( 基於值的事件 )和( 基於編輯的事件 )。

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

答: File’s Owner 是所有 nib 檔案中的每個圖示,它表示從磁碟載入 nib 檔案的物件;

First Responder 就是使用者當前正在與之互動的物件;

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

34.  簡述檢視控制元件器的生命週期(10分)。

答: loadView 儘管不直接呼叫該方法,如多手動建立自己的檢視,那麼應該覆蓋這個方法並將它們賦值給試圖控制器的 view 屬性。

viewDidLoad 只有在檢視控制器將其檢視載入到記憶體之後才呼叫該方法,這是執行任何其他初始化操作的入口。

viewDidUnload 當試圖控制器從記憶體釋放自己的方法的時候呼叫,用於清楚那些可能已經在試圖控制器中建立的物件。

viewVillAppear 當試圖將要新增到視窗中並且還不可見的時候或者上層檢視移出圖層後本檢視變成頂級檢視時呼叫該方法,用於執行諸如改變檢視方向等的操作。實現該方法時確保呼叫 [super viewWillAppear:].

viewDidAppear 當檢視新增到視窗中以後或者上層檢視移出圖層後本檢視變成頂級檢視時呼叫,用於放置那些需要在檢視顯示後執行的程式碼。確保呼叫 [super viewDidAppear: ] 。

35.  動畫有基本型別有哪幾種;表檢視有哪幾種基本樣式(10分)?

答:動畫有兩種基本型別:隱式動畫和顯式動畫。

36.  實現簡單的表格顯示需要設定UITableView的什麼屬性、實現什麼協議(10分)?

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

37.  Cocoa Touch提供了哪幾種Core Animation過渡型別(10分)?

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

38.  UIView與CLayer有什麼區別(10分)?

答: 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 的一套方法提供了一些魔術般的變換效果。

39.連結串列翻轉。

40.  連結串列逆序(C語言)(10分)。

連結串列逆序就是把一個連結串列按照原來的連結順序逆序實現(也就是將頭變成尾,尾變成頭)。

程式設計思路:其實最關鍵的是先通過原來的連結順序找到下個節點,然後再把前個節點反序。

41. Quatrz 2D的繪圖功能的三個核心概念是什麼並簡述其作用(10分)。

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

路徑:是在圖層上繪製的內容;

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

42.  iPhone OS主要提供了幾種播放音訊的方法(10分)?

答: SystemSound Services

AVAudioPlayer 類

Audio Queue Services

OpenAL

43.  使用AVAudioPlayer類呼叫哪個框架、使用步驟(10分)?

答: AVFoundation.framework

步驟:配置 AVAudioPlayer 物件;

實現 AVAudioPlayer 類的委託方法;

控制 AVAudioPlayer 類的物件;

監控音量水平;

回放進度和拖拽播放。

44.  有哪幾種手勢通知方法、寫清楚方法名(10分)?

答:

-(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;

45.  例項化一個UITableView物件,要求寫出關鍵語句(10分)。

答: UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];

my.delegate = self;

my.dataSource = self;

首先需要分配空間設定表格型別

然後需要設定兩個必須的委託物件。

46.  CFSocket使用有哪幾個步驟(10分)。

答:建立 Socket 的上下文;建立 Socket ;配置要訪問的伺服器資訊;封裝伺服器資訊;連線伺服器;

47.  Core Foundation中提供了哪幾種操作Socket的方法(10分)?

答: CFNetwork 、 CFSocket 和 BSD Socket 。

48.  解析XML檔案有哪幾種方式(10分)?

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

49.  自定義一個委託(15分)。

答: @protocol SimpleProtocol

-(void)doSomething:(NSString*)str;

@end

@interfaceSimpleClass:NSObject< SimpleProtocol >{

}

@end

@implementationSimpleClass

-(void)doSomething:(NSString *)str

{

NSLog(str);

}

@end

50.  類別的作用?繼承和類別在實現中有何區別?

答案: category 可以在不獲悉,不改變原來程式碼的情況下往裡面新增新的方法,只能新增,不能刪除修改。 並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因為類別具有更高的優先順序。 類別主要有 3 個作用: (1) 將類的實現分散到多個不同檔案或多個不同框架中。 (2) 建立對私有方法的前向引用。 (3) 向物件新增非正式協議。 繼承可以增加,修改方法,並且可以增加屬性。

51.通知和協議的不同之處?

答案:協議有控制鏈 (has-a) 的關係,通知沒有。 首先我一開始也不太明白,什麼叫控制鏈(專業術語了 ~ )。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解 簡單來說,通知的話,它可以一對多,一條訊息可以傳送給多個訊息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。 只是對於不同明星間,代理的事物物件都是不一樣的,一一對應,不可能說明天要處理 A 明星要一個釋出會,代理人發出處理髮佈會的訊息後,別稱 B 的 釋出會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。 因此控制鏈( has-a 從英語單詞大致可以看出,單一擁有和可控制的對應關係。

52.關於多型性

答案:多型,子類指標可以賦值給父類。 這個題目其實可以出到一切面向物件語言中, 因此關於多型,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。 最重要的是轉化成自我理解。

53.對於單例的理解

答案:基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你程式設計中碰到過運用的此種模式的框架類等。 進一步點,考慮下如何在多執行緒訪問單例時的安全性。

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

答案:一個檢視控制只提供了一個 View 檢視,理論上一個 tableViewController 也不能放吧, 只能說可以嵌入一個 tableview 檢視。當然,題目本身也有歧義,如果不是我們定性思維認為的 UIViewController , 而是巨集觀的表示檢視控制者,那我們倒是可以把其看成一個檢視控制者,它可以控制多個檢視控制器,比如 TabbarController 那樣的感覺。

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

答案:首先我們從程式碼來看,資料來源如何關聯上的,其實是在資料來源關聯的代理方法裡實現的。 因此我們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據自己的需要去設定如相關的資料來源。 因此,我覺得可以設定多個數據源啊,但是有個問題是,你這是想幹嘛呢?想讓列表如何顯示,不同的資料來源分割槽塊顯示?

56. Object -c 的類可以多重繼承麼?可以實現多個介面麼?重寫一個類的方式用繼承好還是分類 好?為什麼?

答案: Objective-c 只支援單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現, cocoa 中所有的類都是 NSObject 的子類,多繼承在這裡是用 protocol 委託代理來實現的。

57. id 宣告的物件有什麼特性?

答案: id 是個很重要的型別,是個可以指向任何型別的指標或者可以理解為指向任何未知型別的指標。

58. 自動釋放池跟GC (垃圾回收)有什麼區別?iPhone上有GC麼?[poolrelease] 和[pooldrain]有什麼區別?

iPhone 上沒有 GC 。 iPhone 開發的時候沒有垃圾回收機制。 在垃圾回收環境中,release 是一個空操作。因此, NSAutoreleasePool 提供了 drain 方法,在引用計數環境中,該方法的作用等同於呼叫 release ,但在垃圾回收環境中,它會觸發垃圾回收(如果自上次垃圾回收以來分配的記憶體大於當前的閾值)。因此,在通常情況下,您應該使用 drain 而不是 release 來銷燬自動釋放池。

59.   執行緒與程序的區別和聯絡?

答案 : 程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。 程和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

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

iOS 中可以有四種持久化資料的方式:屬性列表、物件歸檔、 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 支援對一、對多的關係。

61. obj-c 有多重繼承麼? 如果沒有什麼替代方法?

cocoa 中所有的類都是NSObject 的子類,多繼承在這裡是用protocol 委託代理來實現的。你不用去考慮繁瑣的多繼承,虛基類的概念。

62. obj-c 有私有方法麼? 私有變數呢?

objective-c - 類裡面的方法只有兩種, 靜態方法和例項方法. 這似乎就不是完整的面向物件了,按照OO的原則就是一個物件只暴露有用的東西. 如果沒有了私有方法的話, 對於一些小範圍的程式碼重用就不那麼順手了. 在類裡面聲名一個私有方法

@interface Controller : NSObject { NSString *something; }

+ (void)thisIsAStaticMethod;

- (void)thisIsAnInstanceMethod;

@end

@interface Controller (private) -

(void)thisIsAPrivateMethod;

@end

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

在Objective‐C 中,所有例項變數預設都是私有的,所有例項方法預設都是公有的

63. 假定輸入的字串中只包含字母和* 號。編寫函式fun,功能是,除了中間和尾部的*號外,

將字串中其他* 號全部刪除。編寫時,不用c的其他函式。

例:*****A*BC*DEF*G****    結果為:A*BC*DEF*G****

void fun (char *a)

 {

int j=0;

char *p=a;

while (*p==’*')p++;

while (*p){

a[j++]=*p;

p++;

 }

a[j]=0;

 }

64. 擷取字串”20 |http://www.621life.com“ 中 ‘|’字元前面及後面的資料,分別輸出它們(10分)。

NSString *str = “20|http://www.621life.com”;

NSRange range = [strrangeOfString:@"|"];

int location = range.location;

NSString *str1 = [strsubstringToIndex:location];

NSString *str2 = [str substringFromIndex:location+1];

65. 獲取專案根路徑,並在其下建立一個名稱為userData 的目錄。(10分)。

// 獲取根路徑

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

NSString *documentsDirectory = [paths objectAtIndex:];

// 建立檔案系統管理器

NSFileManager *fileManager = [[NSFileManageralloc] init];

// 判斷userData 目錄是否存在

if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {

// 不存在, 建立一個userData目錄

[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];

}

66. tableView 的重用機制(10 分)?

UITableView 通過重用單元格來達到節省記憶體的目的: 通過為每個單元格指定一個重用識別符號(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出螢幕時,允許恢復單元格以便重用.對於不同種類的單元格