iOS面試題合集(77道)

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

@class通常用於頭文件中須要聲明該類的某個實例變量的時候用到,在m文 件中仍是須要使用#import程序員

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

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,非原子性訪問,不加同步, 多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的…)。sql

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 支持對1、對多的關係。

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),即指定了單元格的種類,以及當單元格滾出 屏幕時,容許恢復單元格以便重用.對於不一樣種類的單元格使用不一樣的ID,對於簡單的表格,一個標識符就夠了.

67. 這段代碼有什麼問題嗎

@implementation Person  

i.       (void)setAge:(int)newAge

{  

self.age = newAge;  

}

死循環

68. 用變量a 給出下面的定義

a)    一個整型

b)    一個指向整型數的指針

c)    一個指向指針的的指針,它指向的指針是指向一個整型數

d)    一個有10 個整型數的數組

e)    一個有10 個指針的數組,該指針是指向一個整型數的

f)    一個指向有10 個整型數數組的指針

g)    一個指向函數的指針,該函數有一個整型參數並返回一個整型數

h)    一個有10 個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數

 

a)    int a;

b)    int *a;

c)    int **a;

d)    int a[10]

e)    int *a[10];

f)    int (*a)[10];

g)    int (*a)(int);

i)    int (*a[10])(int);

 

69. 給定一個字符串,輸出本字符串中只出現一次而且最靠前的那個字符的位置?

好比」abaccddeeef」 則是b,輸出2

 

int find(char *_str)

{

char *p = _str;

inti = 1;

while (*p)

{

char *temp = _str;

while (*temp)

{

if ((*p ==*temp)&&(p != temp))

{

break;

}

temp++;

if (*temp == 0) {

returni;

}

}

i++;

p++;

}

return-1;

}

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

intfind_char(constchar* str)

{

staticintpos[256];

const unsigned char* p =(const unsigned char*)str;

inti = 0;

if( (!str) || (!(*str)) )return -1;

memset(pos,-1,sizeof(pos));

while(*p){

if(pos[*p] == -1){

pos[*p] = p-(const unsigned char*)str;

}else{

pos[*p] = -2;

}

p++;

}

for(i=0;i<sizeof(pos)/sizeof(pos[0]);i++){

if(pos[i]>=0)returnpos[i];

}

return -1;

}

int main()

{

constchar* p =」abaccddeeef」;

intpos = find_char(p);

printf(「%d, it is’%c’\n」,pos,pos!=-1?p[pos]:’ ‘);

p =」abcdefghijklmnopqrstuvwxyz 「

「abcdefghijklmnopqrstuwxyz」;

pos = find_char(p);

printf(「%d, it is’%c’\n」,pos,pos!=-1?p[pos]:’ ‘);

return0;

}

70. objective-c 中的數字對象都有哪些,簡述它們與基本數據類型的區別是什麼?

在OC 中NSNumber是數字對象,能夠進行拆裝箱操做!

// 將int 轉爲NSNumber

NSNumber *num = [NSNumber numberWithInt:123];

// 獲得一個int

inttestNum = [numintValue];

71. 用NSLog 函數輸出一個浮點類型,結果四捨五入,並保留一位小數

NSLog(@」%0.1f」,4.4324);

72. objective-c 中的詞典對象、可變詞典對象是哪一個,初始化一個含有兩個鍵值對的可變詞典對象,並動態的添加和刪除一條記錄,輸出第一條記錄.

詞典NSDictionary ,可變詞典NSMutableDictionary,

// 初始化一個可變詞典,帶有2 個鍵值對

NSMutableDictionary *dic =[NSMutableDictionarydictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];

// 添加

[dicsetObject:@"value3"forKey:@"key3"];

// 刪除

[dicremoveObjectForKey:@"key3"];

// 獲取(按key 獲取)

[dicobjectForKey:@"key1"];

73. 獲取項目根路徑,並在其下建立一個名稱爲userData 的目錄。

// 獲取根路徑

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

}

74. do-while 與 while-do 的區別?

do-while 先執行循環體,而後判斷條件,若是條件判斷爲ture ,則繼續執行循環體,若是判斷爲false,則不執行循環體

while-do 是先判斷條件是否正確,若正確則執行循環體,若不正確則不執行循環體。

因此do-while 至少循環一次,而while-do有可能一次也不循環。

75. 用C 語言,求2到100內的全部素數和。

 

#include<stdio.h>

intisPrime(int n)             // 求素數,這是最經典的算法代碼。建議記住

{

inti;

for(i=2;i*i<=n;i++)

if(n%i==0)

return 0;

return 1;

}

int main()

{

inti,sum=0;

for(i=2;i<100;i++)

if( isPrime(i))

sum+=i;

printf(「%5d」,sum);

return 0 ;

}

intisPrime(int n)

{

   inti;

   for(i=2;i<=n/2;i++)

   {

      if(n%i==0)

         break;

   }

   if(i>n/2)

      return1;

   else

      return0;

}

76.單件實例是什麼(10分)。

Foundation 和 Application Kit 框架中的一些 類 只允 許創 建 單 件 對 象,即 這 些 類 在當前 進 程中的惟一 實 例。 舉 例 來 說 ,NSFileManager 和NSWorkspace 類 在使用時 都是基於 進 程 進 行 單 件 對 象的 實 例化。當 向 這 些 類請 求 實 例的 時 候,它 們會向您 傳遞單 一 實 例的一個引用,若是 該實 例 還 不存在, 則 首先 進 行 實 例的分配 和初始化。 單 件 對 象充當控制中心的角色, 負責 指引或 協調類 的各類服 務 。若是 類 在概念上只有一個 實 例(好比
NSWorkspace ),就 應該產 生 一個 單 件 實 例,而不是多個 實 例;若是未來某一天可能有多個 實 例,您可使用 單 件 實 例機制,而不是工廠方法或函數。

77.自動釋放池是什麼,如何工做。

當您向一個對象發送一個autorelease 消息時,Cocoa就會將該對象的一個

相關文章
相關標籤/搜索