天天看點

iOS 面試題集合~[有答案]

//聯系人:石虎  QQ: 1224614774 昵稱:嗡嘛呢叭咪哄

//聯系人:石虎  QQ: 1224614774 昵稱:嗡嘛呢叭咪哄

 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),即指定了單元格的種類,以及當單元格滾出螢幕時,允許恢複單元格以便重用.對于不同種類的單元格使用不同的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就會将該對象的一個

/*

   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),即指定了單元格的種類,以及當單元格滾出螢幕時,允許恢複單元格以便重用.對于不同種類的單元格使用不同的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就會将該對象的一個