天天看點

ios筆試題

最近找工作,有面試有筆試部分,故把筆試題自己整理了下。

面試能力要求:精通iphone的UI開發,能熟練操作複雜表視圖,熟練使用圖層技術, 可以自定義UI控件,使用類别擴充系統控件功能;  

擅長通訊技術,熟悉各種通信協定,精通xml, json, 二進制或其他形式的自定義解析,能架設伺服器實作用戶端與伺服器的通訊以送出開發效率; 

熟練掌握各種資料存儲技術,如core data, sqlite,  對象序列化,檔案讀寫操作,熟悉資料庫的設計。  

精通 object-c,java, c  等程式設計語言, 熟悉c++,對于 面向對象程式設計思想有深入了解,熟悉常見設計模式的應用,

對于大型項目有一定的架構能力。

1. ViewController的didReceiveMemoryWarning怎麼被調用:

[supper didReceiveMemoryWarning];

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

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

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

3.用預處理指令#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會作三次++自增操作。

4.寫一個委托的 interface

@protocol MyDelegate;

@interface MyClass: NSObject

{

    id <MyDelegate> delegate;

}

// 委托方法

@protocol MyDelegate

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

@end

5. 寫一個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);

}

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

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

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

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

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

7.obj-c有私有方法麼?私有變量呢

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

@interface Controller : NSObject {

   NSString *something;

}

+ (void)thisIsAStaticMethod;

- (void)thisIsAnInstanceMethod;

@end

@interface Controller (private)

-(void)thisIsAPrivateMethod;

@end

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

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

8.關鍵字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的指針時。 

9. 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 /* __INCvxWorksh */ 

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

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

10.#import跟#include的差別,@class呢?

 @class一般用于頭檔案中需要聲明該類的某個執行個體變量的時候用到,在m檔案中還是需要使用#import。

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

11.MVC模式的了解

MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。

模型對象代表特别的知識和專業技能,它們負責保有應用程式的資料和定義操作資料的邏輯。

視圖對象知道如何顯示應用程式的模型資料,而且可能允許使用者對其進行編輯。

控制器對象是應用程式的視圖對象和模型對象之間的協調者。

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

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

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

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

線程有自己的堆棧和局部變量,但線程之間沒有單獨的位址空間,一個線程死掉就等于整個程序死掉。

是以多程序的程式要比多線程的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。

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

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

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

1.程序之間通信的途徑

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

2.程序死鎖的原因

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

3.死鎖的4個必要條件

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

4.死鎖的處理

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

14.堆和棧的差別

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

1.申請大小:

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

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

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

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

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

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

模型的性質是通過一個簡單的鍵(通常是個字元串)來指定的。視圖和控制器通過鍵來查找相應的屬性值。

在一個給定的實體中,同一個屬性的所有值具有相同的資料類型。

鍵-值編碼技術用于進行這樣的查找—它是一種間接通路對象屬性的機制。

鍵路徑是一個由用點作分隔符的鍵組成的字元串,用于指定一個連接配接在一起的對象性質序列。第一個鍵的

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

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

關對象的特定屬性。

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

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

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

 當您向一個對象發送一個autorelease消息時,Cocoa就會将該對象的一個引用放入到最新的自動釋放池。

 它仍然是個正當的對象,是以自動釋放池定義的作用域内的其它對象可以向它發送消息。

 當程式執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。

1.  ojc-c 是通過一種"referring counting"(引用計數)的方式來管理記憶體的, 對象在開始配置設定記憶體(alloc)的時候引用計數為一,

     以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此

     對象的計數變為了0, 就會被系統銷毀.

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

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

19.objc優點:

  1) Cateogies 

  2) Posing 

  3) 動态識别

  4) 名額計算 

  5)彈性訊息傳遞

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

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

   objc缺點: 

  1) 不支援命名空間 

  2)  不支援運算符重載

  3) 不支援多重繼承

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

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

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

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

是以這個字元串拷貝很容易出錯。具備字元串拷貝功能的函數有memcpy,這是一個記憶體拷貝函數,它的函數原型

為memcpy(char *dst, const char* src, unsigned int len);

将長度為len的一段記憶體,從src拷貝到dst中去,這個函數的長度可控。但是會有記憶體疊加的問題。

sprintf是格式化函數。将一段資料通過特定的格式,格式化到一個字元串緩沖區中去。sprintf格式化的函數的長度不可控,

有可能格式化後的字元串會超出緩沖區的大小,造成溢出。

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

a) 一個整型數(An integer)  

b)一個指向整型數的指針( A pointer to an integer)  

c)一個指向指針的的指針,它指向的指針是指向一個整型數( A pointer 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) 一個指向函數的指針,該函數有一個整型參數并傳回一個整型數(A pointer to a function that takes an integer as an argument

 and returns an integer)  

h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并傳回一個整型數( An array of ten pointers to functions t

hat take an integer argument and return an integer )  

答案是:  

a) int a; // An integer  

b) int *a; // A pointer to an integer  

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

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

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

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

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

h) int (*a[10])(int); // An array of 10 pointers to functions  that take an integer argument and return an integer

22.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,非原子性通路,不加同步,多線程并發通路會提高性能。注意,如果不加此屬性,則預設是兩個通路方法

   都為原子型事務通路。鎖被加到所屬對象執行個體級(我是這麼了解的...)。

23.http和scoket通信的差別。

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

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

24.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();

      }

 }

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

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

scm是xcode裡配置版本控制的地方。版本控制的原理就是a和b同時開發一個項目,a寫完當天的代碼之後把代碼送出給伺服器,

b要做的時候先從伺服器得到最新版本,就可以接着做。 如果a和b都要送出給伺服器,并且同時修改了同一個方法,就會産生代碼沖突,

如果a先送出,那麼b送出時,伺服器可以提示沖突的代碼,b可以清晰的看到,并做出相應的修改或融合後再送出到伺服器。

26.什麼是push(了解一下)。

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

27.靜态連結庫(了解一下)

(此為.a檔案,相當于java裡的jar包,把一些類編譯到一個包中,在不同的工程中如果導入此檔案就可以使用裡面的類,

  具體使用依然是#import “ xx.h”)。

28.fmmpeg架構(了解一下)

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

29.fmdb架構(了解一下)

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

30.320架構(了解一下)

(ui架構,導入320工程作為架構包如同添加一個普通架構一樣)。

  cover(open)   flower架構 (2d 仿射技術),内部核心類是CATransform3D.

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

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

iphone沙箱模型的有四個檔案夾,分别是什麼,永久資料存儲一般放在什麼位置,得到模拟器的路徑的簡單方式是什麼.

documents,tmp,app,Library。

(NSHomeDirectory()),

手動儲存的檔案在documents檔案裡

Nsuserdefaults儲存的檔案在tmp檔案夾裡

Documents 目錄:您應該将所有de應用程式資料檔案寫入到這個目錄下。這個目錄用于存儲使用者資料或其它應該定期備份的資訊。

AppName.app 目錄:這是應用程式的程式包目錄,包含應用程式的本身。由于應用程式必須經過簽名,

是以您在運作時不能對這個目錄中的内容進行修改,否則可能會使應用程式無法啟動。

Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences

Preferences 目錄包含應用程式的偏好設定檔案。您不應該直接建立偏好設定檔案,而是應該使用NSUserDefaults類來取得和設定應用程式的偏好.

Caches 目錄用于存放應用程式專用的支援檔案,儲存應用程式再次啟動過程中需要的資訊。

tmp 目錄:這個目錄用于存放臨時檔案,儲存應用程式再次啟動過程中不需要的資訊。

擷取這些目錄路徑的方法:

1,擷取家目錄路徑的函數:

NSString *homeDir = NSHomeDirectory();

2,擷取Documents目錄路徑的方法:

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

NSString *docDir = [paths objectAtIndex:0];

3,擷取Caches目錄路徑的方法:

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

NSString *cachesDir = [paths objectAtIndex:0];

4,擷取tmp目錄路徑的方法:

NSString *tmpDir = NSTemporaryDirectory();

5,擷取應用程式程式包中資源檔案路徑的方法:

例如擷取程式包中一個圖檔資源(apple.png)路徑的方法:

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];

UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

代碼中的mainBundle類方法用于傳回一個代表應用程式包的對象。

檔案IO寫入

1,将資料寫到Documents目錄:

- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {

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

   NSString *docDir = [paths objectAtIndex:0];

   if (!docDir) {

    NSLog(@”Documents directory not found!”); return NO;

   }

   NSString *filePath = [docDir stringByAppendingPathComponent:fileName];

   return [data writeToFile:filePath atomically:YES];

}

2,從Documents目錄讀取資料:

- (NSData *)applicationDataFromFile:(NSString *)fileName {

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

   NSString *docDir = [paths objectAtIndex:0];

   NSString *filePath = [docDir stringByAppendingPathComponent:fileName];

   NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];

   return data;

}

NSSearchPathForDirectoriesInDomains這個主要就是傳回一個絕對路徑用來存放我們需要儲存的檔案。

- (NSString *)dataFilePath {

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

   NSString *documentsDirectory = [paths objectAtIndex:0];

   return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];

}

NSFileManager* fm=[NSFileManager defaultManager];

if(![fm fileExistsAtPath:[self dataFilePath]]){

//下面是對該檔案進行制定路徑的儲存

[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];

//取得一個目錄下得所有檔案名

NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];

//讀取某個檔案

NSData *data = [fm contentsAtPath:[self dataFilePath]];

//或者

NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];

}

iphone常見私有api的應用(比如直接發送短信,通路沙箱之外的磁盤檔案).

32.你在開發項目中時,用到了哪些資料存儲方式,iphone中常見的方式有哪些,各有什麼差別?

資料存儲五種形式的應用範圍和性能差別

(core data,  sqllite,對象序列化,檔案直接讀寫,NSUserDefault(儲存資料到temp檔案夾中))

檔案直接讀寫 >core data> 對象序列化> sqllite>NSUserDefault.

33.線程的常見方法有哪些,你是如何處理多線程的,多線程同步問題你了解麼?

線程建立的幾種方式,線程的加鎖,休眠,喚醒,解鎖,退出,

多線程要考慮同步問題,解決同步問題的方式就是對某一資源加鎖,當一個線程操作本資源時,其他線程不能操作 。

系統自帶線程池(NSOpertionQueue)的作用:

凡是需要啟動多個線程的地方都可以使用NSOpertionQueue,加入到NSOpertionQueue中的對象都需要繼承NSOpertion。 NSOpertionQueue會在系統内部啟動一個獨立線程去執行這個被加入對象的main方法。

常用的地方是用nsoprationqueue 下載下傳圖檔,檔案。如果是自己建立一個線程池,無非就是啟動多個線程的時候,

把這些線程對象放到一個大數組中,如果需要啟動線程的時候,先從數組中找空閑線程來使用。

自己管理線程池最大的難題是不好處理當啟動多個線程後,使用者在多個界面的跳轉的時候,對線程方法的回調管理。

而NSOpertionQueue可以很好的處理他。

34.init和initwithobject差別(文法)?

   init建立的對象不帶自動釋放

35.你連接配接伺服器用的是什麼方法,如果請求過程中,網絡出了問題這麼辦?

NSUrlConnection 連接配接後,有一系列委托方法來接受來自伺服器的響應和資料,

其中接受相應的方法回得到伺服器要傳回的資料有多大,接受資料的方法會反複調用來不斷接受伺服器資料,

如果網絡出了問題了,會調用一個方法讓你來做相關處理。

36.你使用過json解析方式麼,他們的底層是如何處理的你了解麼?

json解析的用法,用架構的用法簡單介紹:

底層原理周遊字元串中的字元,最終根據格式規定的特殊字元,比如{}号,[]号, : 号 等進行區分,

 {}号是一個字典的開始,[]号是一個數組的開始, : 号是字典的鍵和值的分水嶺,最終乃是将json資料轉化為字典,

字典中值可能是字典,數組,或字元串而已。

37.xml解析的原理是什麼,你還用過其他解析方式麼?

NSXMLParser, 其他解析方式有自定義二進制解析,就是按位元組去解析,電話會談就是如此,

還可以是字元串之間用特殊符号連接配接的資料,将此資料用特殊符号可以分割成所用資料。

38.協定是什麼,有什麼作用.?

協定很像java中的接口,某個類實作協定後,就必須實作協定中規定的@require的方法,比如一個類A, 一個類B都實作某“協定”後,

這個類A的對象和B的對象都可以指派給這個協定的類型變量,比如  id<協定> 變量名 = A類或B類的對象,

于是這個變量就完成了能夠指向多個不同的類的對象并調用對象中的實作協定的方法。

39.類别有什麼作用?

類别的使用 。 類别有三大作用,

1. 可以使本來需要在.h中聲明的方法放到.m檔案中聲明,達到了可以使方法不對外公開。

2. 可以友善的擴充類,甚至系統類都可以輕易擴充,維護了代碼原本的結構不受影響。

3. 類别可以寫到不同的.h或.m檔案中,可以分散代碼到跟類别的擴充功能想關聯的地方,友善檢視。

40.分線程回調主線程方法是什麼,有什麼作用? 

[self    performSelectorOnMainThread:@selector(buttonGo2) withObject:nil waitUntilDone:YES];

[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];

需要即時重新整理ui控件的時候,經常使用。

41.iphone閱讀器,如果要讀取一個文本檔案,請問你是如何處理編碼問題的?另外像pdf格式的檔案,你如何讀取。?

iphone手機閱讀器中對于PDF格式的閱讀,可以直接用UIWebView控件顯示,也可以從網上下到很多直接讀取pdf格式的代碼

直接從pdf中得到資料。

複雜表格動畫

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

42.你在開發大型項目的時候,如何進行記憶體洩露檢測的?

  可以通過xcode的自帶工具run---start with performance tool裡有instruments下有個leaks工具,

  啟動此工具後,運作項目,工具裡可以顯示記憶體洩露的情況,輕按兩下可找到源碼位置,可以幫助進行記憶體洩露的處理。

43.你做iphone開發時候,有哪些傳值方式,view和view之間是如何傳值的?

     壓棧。

44.讓一個物體從界面中的一點運動到另外一點,有哪些方法?

四種方式:1. beginAnimation

              2. 線程

              3. NSTimer

              4. 圖層動畫(路徑)

45.你了解哪些加密方式?

   Base64, MD5, 循環右移位等.

46.地圖定位

CLLocationManager位置管理器  使用Core Location架構來确定iphone的位置(GPS,蜂窩基站三角網,wps三種方式)    

MKMapView提供了一套可植入的地圖接口,可以讓我們在應用中展示地圖,并對其進行相關的操作。一般來說,我們可以指定一個展示區域,放一些标記在上面,還可以加蓋一些層在上面。

MKMapView依賴Google map裡面相關服務(如Google Earth API等),是以地圖的左下角會有Google字樣。

47.打開url

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];mailto://   sms://

48. http網絡通信

ASIHTTPRequest 是一個直接在CFNetwork上做的開源項目:提供直接送出(HTTP POST)檔案的API,異步請求與隊列,自動管理上傳與下載下傳隊列管理機,ASIFormDataRequest用于适合上傳檔案,圖檔資料。

49. 圖檔浏覽

UIImagePickerController可以從相冊,相機,膠卷裡獲得圖檔。

50. 對像序列化

NSCoding    encodeWithCoder   initWithCoder

NSKeyedUnarchiver   NSKeyedArchiver

51. 各種picker

UIDatePicker   UIPickerView

52. 電影播放

     MPMoviePlayerController

     音樂播放

     MPMusicPlayerController

53.線程 ?

      a. 線程的建立和使用規則?

         答:NSThread

                 三種方法

                - (id)init; // designated initializer

                - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

                + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

                 - (void)start;

       b. 主分線程

          答:啟動分線程,上面已提到!加到主線程方法performSelector!

          //加到主線程addData()是主線程的方法!隻有加到主線程後,才能調用主線程的方法

         [target performSelector:@selector(addData:) onThread:[NSThread mainThread] withObject:item waitUntilDone:YES];

           //[target addData:item];//沒有加到主線程後,調用主線程的方法!一定會崩!

      c.線程鎖

         答:NSCondition

                 方法:

                 [thread lock];//加鎖

                 sleep(n);//線程休眠

                 [thread singnal];//相當于通知,線程啟動

                 [thread unlock];//解鎖

                 [thread exit];//線程退出

54.各種 排序算法?

     希爾排序、快速排序、冒泡排序、

55.通信底層原理

    答:OSI七層模型

    7 應用層:    ftp,smtp,http,telnet,tftp(通過各種協定,最終還是包裝成TCP資料包,發送到網絡中!)

    6 表現層:

    5 會話層:

    4 傳輸層:    tcp udp

    3 網絡層:    ip,ICMP,IGRP,EIGRP,OSPF,ARP

    2 資料鍊路層: STP,VT

    1 實體層:

56. 為什麼很多内置類如UITableViewController的delegate屬性都是assign而不是retain的?

答:

      會引起循環引用

      所有的引用計數系統,都存在循環應用的問題。例如下面的引用關系:

          * 對象a建立并引用到了對象b.

          * 對象b建立并引用到了對象c.

          * 對象c建立并引用到了對象b.

      這時候b和c的引用計數分别是2和1。

      當a不再使用b,調用release釋放對b的所有權,因為c還引用了b,是以b的引用計數為1,b不會被釋放。

      b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在記憶體中。

這種情況,必須打斷循環引用,通過其他規則來維護引用關系。我們常見的delegate往往是assign方式的屬性而不是retain方式 的屬性,

指派不會增加引用計數,就是為了防止delegation兩端産生不必要的循環引用。

如果一個UITableViewController 對象a通過retain擷取了UITableView對象b的所有權,這個UITableView對象b的delegate又是a,

如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。自己在設計使用delegate模式時,也要注意這點。

57. 以下每行代碼執行後,person對象的retain count分别是多少?

      Person *person = [[Person alloc] init]; count 1

      [person retain]; retain  count 2

      [person release];retain count 1

      [person release];retain count = 0

58.在一個對象的方法裡面:

      self.name = “object”;

      和

      name =”object”

      有什麼不同嗎?  

答:self.name = "object"會調用對象的setName()方法,會使object引用計數加1,name = "object"會直接把object指派給目前對象的name 屬性,引用計數不增加。

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

@property是一個屬性通路聲明,擴号内支援以下幾個屬性:
1,getter=getterName,setter=setterName,設定setter與getter的方法名
2,readwrite,readonly,設定可供通路級别


3,assign,setter方法直接指派,不進行任何retain操作,為了解決原類型與環循引用問題
4,retain,setter方法對參數進行release舊值再retain新值,所有實作都是這個順序(CC上有相關資料)


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


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

7,@synthesize xxx; 來實作實際代碼

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

ios筆試題