iphone面試題目

才智咖 人氣:1.25W

()

iphone面試題目

{

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

2. 以下為Windows NT下的32位C 程式,請計算sizeof的值

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。

3.還是考指標,不過我對cocoa的程式碼還是不太熟悉

大概是這樣的

- (void)*getNSString(const NSString * inputString)

{

inputString = @"This is a main testn";

return ;

}

-main(void)

{

NSString *a=@"Main";

NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];

NSLog(@"%@n", aString);

}

最後問輸出的字串:NULL,output在 函式返回後,記憶體已經被釋放。

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

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

我在這想看到幾件事 情:

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

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

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

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

寫一個"

標準"巨集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會作三次 自增操作。

5.寫一個委託的 interface

@protocol MyDelegate;

@interface MyClass: NSObject

{

id delegate;

}

// 委託方法

@protocol MyDelegate

- (void)didJobs:(NSArray *)args;

@end

6. 寫一個NSString類的實現

(id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

(id) stringWithCString: (const char*)nullTerminatedCString

encoding: (NSStringEncoding)encoding

{

NSString *obj;

obj = [self allocWithZone: NSDefaultMallocZone()];

obj = [obj initWithCString: nullTerminatedCString encoding: encoding];

return AUTORELEASE(obj);

}

-c有多重繼承麼?不是的話有什麼替代方法?

cocoa 中所有的類都是NSObject 的子類

多繼承在這裡是用protocol 委託代理 來實現的

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

ood的多型特性 在 obj-c 中通過委託來實現.

-c有私有方法麼?私有變數呢

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

@interface Controller : NSObject { NSString *something; }

(void)thisIsAStaticMethod;

- (void)thisIsAnInstanceMethod;

@end

@interface Controller (private) -

(void)thisIsAPrivateMethod;

@end

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

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

9.關鍵字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 型別,以使得其返回值不為“左值”。

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

一個定義為 volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到

這個變數時必須 每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

?; 並行裝置的硬體暫存器(如:狀態暫存器)

?; 一箇中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)

?; 多執行緒應用中被幾個任務共享的變數

?; 一個引數既可以是const還可以是volatile嗎?解釋為什麼。

?; 一個指標可以是volatile 嗎?解釋為什麼。

下 面是答案:

?; 是的。一個例子是隻讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。

?; 是的。儘管這並不很常見。一個例子是當一箇中服務子程式修該一個指向一個buffer的指標時。

static 關鍵字的作用:

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

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

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

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

它的模組內;

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

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

extern "C" 的作用

(1)被 extern "C"限定的函式或變數是 extern 型別的;

extern 是 C/C 語言中表明函式和全域性變數作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,

其宣告的函式和變數可以在本模組或 其它模組中使用。

(2)被 extern "C"修飾的變數和函式是按照 C 語言方式編譯和連線的;

extern "C"的慣用法

(1)在 C 中引用 C 語言中的函式和變數,在包含 C 語言標頭檔案(假設為 cExample.h)時,需進

行下列處理:

extern "C"

{

#include "cExample.h"

}

而在 C 語言的標頭檔案中,對其外部函式只能指定為 extern 型別,C 語言中不支援 extern "C"宣告,

在.c 檔案中包含了 extern "C"時會出現編譯語法錯誤。

(2)在 C 中引用 C 語言中的函式和變數時,C 的標頭檔案需新增 extern "C",但是在 C 語言中不

能直接引用聲明瞭 extern "C"的該標頭檔案,應該僅將 C 檔案中將 C 中定義的 extern "C"函式宣告為

extern 型別。

10.為什麼標準標頭檔案都有類似以下的結構?

#ifndef __INCvxWorksh

#define __INCvxWorksh

#ifdef __cplusplus

extern "C" {

#endif

#ifdef __cplusplus

}

#endif

#endif

顯然,標頭檔案中的編譯巨集“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用

是防止該標頭檔案被重複引用。

11.#import跟#include的區別,@class呢?

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

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

模式的理解

MVC設計模式考慮三種物件:模型物件、檢視物件、和控制器物件。模型物件代表 特別的知識和專業技能,它們負責保有應用程式的資料和定義操作資料的邏輯。檢視物件知道如何顯示應用程式的模型資料,而且可能允許使用者對其進行編輯。控制 器物件是應用程式的檢視物件和模型物件之間的協調者。

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

程序和執行緒都是由作業系統所體會的程式執行的基本 單元,系統利用該基本單元實現系統對應用的併發性。

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

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

答案: 原子操作 訊號量機制 自旋鎖 管程,會合,分散式系統

程序之間通訊的途徑

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

進 程死鎖的原因

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

死鎖的4個必要條 件

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

死鎖的處理

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

15.堆和棧的區別

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

申請大小:

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

堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地 址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

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

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由 alloca函式進行分配,但是棧的動態分配和堆是不同的,他的'動態分配是由編譯器進行釋放,無需我們手工實現。

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

16.什麼是鍵-值,鍵路徑是什麼

模型的性質是通過一個簡單的鍵(通常是個字串)來指定的。檢視和控制器通過鍵 來查詢相應的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的資料型別。鍵-值編碼技術用於進行這樣的查詢—它是一種間接訪問物件屬性的機制。

鍵路徑是一個由用點作分隔符的鍵組成的字串,用於指定一個連線在一起的物件性 質序列。第一個鍵的

性質是由先前的性質決定的,接下來每個鍵的值也是相對於其前面的性質。鍵路徑使您可以以獨立於模型

實現的方式指定相關 物件的性質。通過鍵路徑,您可以指定物件圖中的一個任意深度的路徑,使其指向相

關物件的特定屬性。

For example, the key path etwould get the value of the address property from the receiving

object, and then determine the street property relative to the address object.

17.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.

18.目標-動作機制

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

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

動作是控制元件傳送給目標的訊息,或者從目標的角度看,它是目標為了響應動作而實現 的方法。

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

a 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

網路/li>

Bonjour

WebKit

BSD Sockets

使用者應用

Address Book

Core Location

Map Kit

Store Kit

的記憶體管理

? 如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來建立物件,您就擁

有這個物件,需要負責該物件的釋放。這個規則在使用NSObject的便利方法new 時也同樣適用。

? 如果您拷貝一個物件,您也擁有拷貝得到的物件,需要負責該物件的釋放。

? 如果您保持一個物件,您就部分擁有這個物件,需要在不再使用時釋放該物件。

反過來,

? 如果您從其它物件那裡接收到一個物件,則您不擁有該物件,也不應該釋放它(這個規則有少數

的例外,在參考文件中有顯式的說明)。

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

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

1. ojc-c 是通過一種"referring counting"(引用計數)的方式來管理記憶體的, 物件在開始分配記憶體(alloc)的時候引用計數為一,以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此物件的計數變為了0, 就會被系統銷燬.

2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.

3. autorelease和release沒什麼區別,只是引用計數減一的時機不同而已,autorelease會在物件的使用真正結束的時候才做引用計數 減一.

22.類工廠方法是什麼

類工廠方法的實現是為了向客戶提供方便,它們將分配和初始化合在一個步驟中, 返回被建立的物件,並

進行自動釋放處理。這些方法的形式是 (type)className...(其中 className不包括任何字首)。

工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以 為初始化過程提供對

象的分配資訊。

類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件例項。雖 然init...方法可以確認一

個類在每次程式執行過程只存在一個例項,但它需要首先分配一個“生的”例項,然後還必須釋放該例項。

工廠 方法則可以避免為可能沒有用的物件盲目分配記憶體。

23.單件例項是什麼

Foundation 和 Application Kit 框架中的一些類只允許建立單件物件,即這些類在當前程序中的唯一例項。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基於程序進行單件物件的例項化。當向這些類請求例項的時候,它們會向您傳遞單一例項的一個引用,如果該例項還不存在,則首先進行例項的分配 和初始化。 單件物件充當控制中心的角色,負責指引或協調類的各種服務。如果類在概念上只有一個例項(比如

NSWorkspace),就應該產生 一個單件例項,而不是多個例項;如果將來某一天可能有多個例項,您可

以使用單件例項機制,而不是工廠方法或函式。

24.動態繫結

—在執行時確定要呼叫的方法

動態繫結將呼叫方法的確定也推遲到執行時。在編譯時,方法的呼叫並不和程式碼繫結 在一起,只有在消實發送出來之後,才確定被呼叫的程式碼。通過動態型別和動態繫結技術,您的程式碼每次執行都可以得到不同的結果。執行時因子負責確定訊息的接 收者和被呼叫的方法。 執行時的訊息分發機制為動態繫結提供支援。當您向一個動態型別確定了的物件傳送訊息時,執行環境系統會通過接收者的isa指標定位物件的類,並以此為起點 確定被呼叫的方法,方法和訊息是動態繫結的。而且,您不必在Objective-C 程式碼中做任何工作,就可以自動獲取動態繫結的好處。您在每次傳送訊息時,

特別是當訊息的接收者是動態型別已經確定的物件時,動態繫結就會例行而 透明地發生。

-c的優缺點

objc優點:

1) Cateogies

2) Posing

3) 動態識別

4) 指標計算

5)彈性訊息傳遞

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

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

缺點:

1) 不支援名稱空間

2) 不支援運算子過載

3) 不支援多重繼承

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

ntf,strcpy,memcpy使用上有什 麼要注意的地方

strcpy是一個字串拷貝的函式,它的函式原型為strcpy(char *dst, const char *src);

將src開始的一段字串拷貝到dst開始的記憶體中去,結束的標誌符號為 '