最近找工做,有面試有筆試部分,故把筆試題本身整理了下。html
面試能力要求:java
精通iphone的UI開發,能熟練操做複雜表視圖,熟練使用圖層技術, 能夠自定義UI控件,使用類別擴展系統控件功能;
擅長通信技術,熟悉各類通訊協議,精通xml, json, 二進制或其餘形式的自定義解析,能架設服務器實現客戶端與服務器的通信以提交開發效率; ios
熟練掌握各類數據存儲技術,如core data, sqlite, 對象序列化,文件讀寫操做,熟悉數據庫的設計。 c++
精通 object-c,java, c 等編程語言, 熟悉c++,對於 面向對象編程思想有深刻理解,熟悉常見設計模式的應用,對於大型項目有必定的架構能力。程序員
1. ViewController的didReceiveMemoryWarning怎麼被調用:web
[supper didReceiveMemoryWarning];面試
2.何時用delegate,何時用Notification?objective-c
delegate針對one-to-one關係,用於sender接受到reciever的某個功能反饋值。算法
notification針對one-to-one/many/none,reciver,用於通知多個object某個事件。sql
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
01 |
@protocol MyDelegate; |
02 |
@ interface MyClass: NSObject |
03 |
{ |
04 |
id <MyDelegate> delegate ; |
05 |
} |
06 |
|
07 |
// 委託方法 |
08 |
@protocol MyDelegate |
09 |
- ( void )didJobs:(NSArray *)args; |
10 |
@end |
5. 寫一個NSString類的實現
01 |
+ (id)initWithCString:( const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; |
02 |
|
03 |
+ (id) stringWithCString: ( const char *)nullTerminatedCString |
04 |
encoding: (NSStringEncoding)encoding |
05 |
{ |
06 |
NSString *obj; |
07 |
|
08 |
obj = [self allocWithZone: NSDefaultMallocZone()]; |
09 |
obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; |
10 |
return AUTORELEASE(obj); |
11 |
} |
6.obj-c有多重繼承麼?不是的話有什麼替代方法?
cocoa 中全部的類都是NSObject 的子類
多繼承在這裏是用protocol 委託代理 來實現的
你不用去考慮繁瑣的多繼承 ,虛基類的概念.
ood的多態特性 在 obj-c 中經過委託來實現.
7.obj-c有私有方法麼?私有變量呢
objective-c - 類裏面的方法只有兩種, 靜態方法和實例方法. 這彷佛就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西. 若是沒有了私有方法的話, 對於一些小範圍的代碼重用就不那麼順手了. 在類裏面聲名一個私有方法
01 |
@ interface Controller : NSObject { |
02 |
NSString *something; |
03 |
} |
04 |
+ ( void )thisIsAStaticMethod; |
05 |
- ( void )thisIsAnInstanceMethod; |
06 |
@end |
07 |
|
08 |
@ interface Controller ( private ) |
09 |
-( void )thisIsAPrivateMethod; |
10 |
@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 that 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,設置可供訪問級別
3,assign,setter方法直接賦值,不進行任何retain操做,爲了解決原類型與環循引用問題
4,retain,setter方法對參數進行release舊值再retain新值,全部實現都是這個順序(CC上有相關資料)
5,copy,setter方法進行Copy操做,與retain處理流程同樣,先舊值release,再 Copy出新的對象,retainCount爲1。
這是爲了減小對上下文的依賴而引入的機制。
6,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的對象,這個對象是全局惟一的。
觀察者模式: 當一個物體發生變化時,會通知全部觀察這個物體的觀察者讓其作出反應。實現起來無非就是把全部觀察者的對象給這個物體,當這個物體的發生改變,就會調用遍歷全部觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。
工廠模式:
1 |
public class Factory{ |
2 |
public static Sample creator( int which){ |
3 |
|
4 |
if (which==1) |
5 |
return new SampleA(); |
6 |
else if (which==2) |
7 |
return new SampleB(); |
8 |
} |
9 |
} |
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目錄:
01 |
- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName { |
02 |
|
03 |
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); |
04 |
|
05 |
NSString *docDir = [paths objectAtIndex:0]; |
06 |
|
07 |
if (!docDir) { |
08 |
|
09 |
NSLog(@」Documents directory not found!」); return NO; |
10 |
|
11 |
} |
12 |
|
13 |
NSString *filePath = [docDir stringByAppendingPathComponent:fileName]; |
14 |
|
15 |
return [data writeToFile:filePath atomically:YES]; |
16 |
|
17 |
} |
2,從Documents目錄讀取數據:
01 |
- (NSData *)applicationDataFromFile:(NSString *)fileName { |
02 |
|
03 |
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); |
04 |
|
05 |
NSString *docDir = [paths objectAtIndex:0]; |
06 |
|
07 |
NSString *filePath = [docDir stringByAppendingPathComponent:fileName]; |
08 |
|
09 |
NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease]; |
10 |
|
11 |
return data; |
12 |
|
13 |
} |
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].