100道iOS面試題

面試題:html

1__weak何時用java

想要在block內部變外部變量須要加__weak或者__blockios

2.是否使用過coreImage和coreText?若是使用過,說說你的體驗(答案在另外一份)c++

3.什麼是IP,HTTP,TCP、UDP等協議?他們分別屬於第幾層?git

IP屬於網絡層(第三層);TCP和UDP都屬於傳輸層(第四層);HTTP屬於應用層(第七層)。程序員

IP協議保證計算機發送和接收分組數據,負責將消息從一個主機傳送到另外一個主機。github

HTTP協議是超文本傳輸協議,規定客戶端和服務器之間的數據傳輸格式,讓客戶端和服務器能有效進行數據溝通。web

HTTP的完整通訊過程:請求和響應。HTTP協議規定,客戶端向服務器請求內容必須包含請求行,請求頭,請求體;服務器向客戶端返回數據包含狀態行,響應頭,響應體內容。面試

客戶端向服務器發送HTTP請求的方案有4種,經過NSURLConnection;NSURLSession(不太會);CFNetwork;第三方框架ASI,AFN。算法

(1)NSURLConnection:

使用NSURLConnection發送GET請求步驟:1建立NSURL對象,設置請求路徑;

2傳入NSURL建立一個NSURLRequest對象;3使用NSURLConnection發送NSURLRequest;4發送異步請求(block回調,代理)

使用NSURLConnection發送POST請求步驟:1建立NSURL對象,設置請求路徑;

2傳入NSURL建立一個NSURLRequest對象;3使用NSURLConnection發送NSURLRequest;4設置請求體 5發送異步請求(block回調,代理)

(3)CFNetwork:

使用CFNetwork實現TCP協議的通訊,CFNetwork使用CFSocket表明兩端的通訊接口,經過CFStream讀寫數據。

使用CFSocket實現TCP服務器端還有客戶端。步驟:

須要建立一個監聽socket鏈接的CFSocket,爲kCFSocketAcceptCallBack事件綁定一個回調函數,調用CFSocketSetAddress()函數,將CFSocket綁定到本地的IP地址和端口號,CFSocket做爲source添加到線程的CFRunloop上,運行。

(4)AFNetworking:

》使用AFN實現網絡通訊。

》提交get和post請求。

1建立AFHTTPReequestOperationManager對象;

2爲對象指定解析器

3發送get請求或post請求

4在success參數處理服務器響應成功的正確數據;在failure處理錯誤數據。

》使用AFN上傳文件

簡單調用post請求就能夠了。

》使用AFN能夠處理JSON/plist/XML響應

ASI:使用ASIHTTPRequest實現網絡編程

處理同步異步請求發送get請求:步驟1建立ASIHTTPRequest對象;獲取服務器響

TCP,UDP的區別: 

TCP---傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間創建一個TCP鏈接,以後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。 

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,可是並不能保證它們能到達目的地。因爲UDP在傳輸數據報前不用在客戶和服務器之間創建一個鏈接,且沒有超時重發等機制,故而傳輸速度很快

4.什麼是OpenGL?具體使用

OpenGL即是「開放的圖形程序接口」。

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

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

6.寫一個委託的 interface

@protocolMyDelegate;

@interfaceMyClass:NSObject

{

 Id<MyDelegate>delegate;

}

7.寫一個NSString類的實現

+ (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+ (id) stringWithCString: (c*****t char*)nullTerminatedCString  

            encoding: (NSStringEncoding)encoding

{

  NSString  *obj;

  obj = [self allocWithZone: NSDefaultMallocZone()];

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

  return AUTORELEASE(obj);

}

8.爲何標準頭文件都有相似如下的結構?  

   #ifndef __INCvxWorksh  

   #define __INCvxWorksh  

   #ifdef __cplusplus  

   extern "C" {  

   #endif  

   /*...*/  

   #ifdef __cplusplus  

   }  

   #endif  

   #endif /* __INCvxWorksh */ 

第一,防止重複包含頭文件;

第二點:以下: 

 這樣作是爲了C++程序要調用已經被編譯後的C函數!! 

9.列舉幾種進程的同步機制,並比較其優缺點

原子操做、信號量機制、自旋鎖、管程、會合、分佈式系統。

進程之間通訊的途徑:共享存儲系統消息傳遞系統管道:以文件系統爲基礎 


進程死鎖的緣由:資源競爭及進程推動順序非法 


死鎖的4個必要條件:互斥、請求保持、不可剝奪、環路 


死鎖的處理:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖

10.什麼是鍵-值,鍵路徑是什麼模型的性質是經過一個簡單的鍵(一般是個字符串)來指定的。視圖和控制器經過鍵來查找相應的屬性值。在一個給定的實體中,同一個屬性的全部值具備相同的數據類型。鍵-值編碼KVC技術用於進行這樣的查找—它是一種間接訪問對象屬性的機制。鍵路徑是一個由用點做分隔符的鍵組成的字符串,用於指定一個鏈接在一塊兒的對象性質序列。第一個鍵的
性質是由先前的性質決定的,接下來每一個鍵的值也是相對於其前面的性質。鍵路徑使您能夠以獨立於模型
實現的方式指定相關對象的性質。經過鍵路徑,您能夠指定對象圖中的一個任意深度的路徑,使其指向相
關對象的特定屬性。

11.c和o.bj-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 

12.objc優勢和objc缺點?objc優勢:
  1) Cateogies 
  2) Posing 
  3) 動態識別
  4) 指標計算 
  5)彈性訊息傳遞
  6) 不是一個過分複雜的C衍生語言
  7)Objective-C與 C++ 可混合編程
  缺點: 
  1) 不支援命名空間 
  2)  不支持運算符重載  3) 不支持多重繼承4) 使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優化方法都用不到,性能低劣。

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

strcpy是⼀個字符串拷⻉的函數,它的函數原型爲strcpy(char *dst, c*****t char *src);長度是咱們不可控制的
memcpy,這是⼀個內存拷⻉函數,它的函數原型爲memcpy(char *dst, c*****t char* src, unsigned int len);將⻓度爲len的⼀段內存,從src拷⻉到dst中去,這個函數的⻓度可控可是會有內存疊加的問題;
sprintf是格式化函數。將⼀段數據經過特定的格式,格式化到⼀個字符串緩衝區中去。

14.靜態連接庫?靜態連接庫就是你使用的.lib文件,庫中得代碼最後須要鏈接到你的可執行文件中去,因此靜態鏈接的可執行文件通常比較大一些。 (1)引用:格式如:#pragma comment(lib,"XXX.lib")(2)針對開發環境:1》若是使用VC,能夠在Project Setting-->Link中加入你的靜態庫,也能夠直接把該.lib文件加入到你的工程中 2》若是使用Visual Studio,位置在 項目→配置屬性→鏈接器→輸入→附加依賴項 中加入.lib文件。靜態連接庫不一樣於動態連接庫(*.dll),在靜態庫狀況下,函數和數據被編譯進一個二進制文件(一般擴展名爲*.LIB),Visual C++的編譯器在連接過程當中將從靜態庫中恢復這些函數和數據並把他們和應用程序中的其餘模塊組合在一塊兒生成可執行文件。這個過程稱爲"靜態連接",此時由於應用程序所需的所有內容都是從庫中複製了出來,因此靜態庫自己並不須要與可執行文件一塊兒發行。

15.動態連接庫?DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。例如,在 Windows 操做系統中,Comdlg32 DLL 執行與對話框有關的常見函數。所以,每一個程序均可以使用該 DLL 中包含的功能來實現「打開」對話框。這有助於促進代碼重用和內存的有效使用。 經過使用 DLL,程序能夠實現模塊化,由相對獨立的組件組成。例如,一個計賬程序能夠按模塊來銷售。能夠在運行時將各個模塊加載到主程序中(若是安裝了相應模塊)。由於模塊是彼此獨立的,因此程序的加載速度更快,並且模塊只在相應的功能被請求時才加載。 此外,能夠更爲容易地將更新應用於各個模塊,而不會影響該程序的其餘部分。例如,您可能具備一個工資計算程序,而稅率每一年都會更改。當這些更改被隔離到 DLL 中之後,您無需從新生成或安裝整個程序就能夠應用更新

16.靜態連接庫和動態連接庫的優缺點?

靜態連接庫的優勢:(1) 代碼裝載速度快,執行速度略比動態連接庫快;  (2) 只需保證在開發者的計算機中有正確的.LIB文件,在以二進制形式發佈程序時不需考慮在用戶的計算機上.LIB文件是否存在及版本問題,可避免DLL地獄等問題。 

2 動態連接庫的優勢:(1) 更加節省內存並減小頁面交換;(2) DLL文件與EXE文件獨立,只要輸出接口不變(即名稱、參數、返回值類型和調用約定不變),更換DLL文件不會對EXE文件形成任何影響,於是極大地提升了可維護性和可擴展性;(3) 不一樣編程語言編寫的程序只要按照函數調用約定就能夠調用同一個DLL函數(4)適用於大規模的軟件開發,使開發過程獨立、耦合度小,便於不一樣開發者和開發組織之間進行開發和測試。

3 不足之處:(1) 使用靜態連接生成的可執行文件體積較大,包含相同的公共代碼,形成浪費;(2) 使用動態連接庫的應用程序不是自完備的,它依賴的DLL模塊也要存在,若是使用載入時動態連接,程序啓動時發現DLL不存在,系統將終止程序並給出錯誤信息。而使用運行時動態連接,系統不會終止,但因爲DLL中的導出函數不可用,程序會加載失敗;速度比靜態連接慢。當某個模塊更新後,若是新模塊與舊的模塊不兼容,那麼那些須要該模塊才能運行的軟件,通通撕掉。這在早期Windows中很常見。

17.ffmpeg(FFMpeg)框架是一個集錄轉音視頻編碼解碼功能爲一體的完整的開源解決方案。

18.fmdb(FMDB)框架操做數據庫的第三方框架。對sqlite的數據封裝

下載地址:https://github.com/ccgus/fmdb

19.320框架(three20框架) Three20 UI 是一個iPhone開發圖形接口類的集合,包含圖片查看,通常工具,HTTP本地緩存。Three20是來自於Facebook的iPhone程序源代碼的

20.什麼是沙箱模型?哪些操做是屬於私有api範疇?直接發送短信,訪問沙箱以外的磁盤文件。

沙箱模型有4個文件夾:documentstmp,app,Library

手動保存的文件在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]];

 }

 

21.你在開發項目中時,用到了哪些數據存儲方式,iphone中常見的方式有哪些,各有什麼區別?plist屬性列表(NSArray,NSDictionary),經過XML保存數據,不能保存自定義對象;preference(NSUserDefaults,偏好設置),專門用來保存應用程序的配置信息,數據存儲在preference文件夾裏面,不能保存普通對象;對象歸檔(NSCoding,NSKeyedArchiver),實現NSCoding協議,對象序列化,保存自定義對象;SQLite3數據庫純C語言,建立數據庫,執行SQL語句對數據進行增刪改查;CoteData面向對象框架,經過託管對象上下文NSManagedObjectContext對實體增刪改查。

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

NSThread;GCD;NSOperation。線程加鎖,休眠,喚醒,解鎖,退出。使用@synchronize實現同步,同步鎖。

23..init和initwithobject區別(語法)?後者給屬性值

 24.你鏈接服務器用的是什麼方法,若是請求過程當中,網絡出了問題這麼辦?

NSURLConnection請求的方法;檢測網絡狀態,監聽網絡狀態改變,發送請求超時。

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

遍歷字符串的字符,最終將格式規定的特殊字符轉化爲字典去解析

26.xml解析的原理是什麼?你還用過其餘解析方式嗎?DOM( W3C推薦的處理XML解析的規範,對文檔CRUD方便,一次性將整個XML文檔加載進內存,佔用內存大,適合解析小文件)和SAX(從根元素開始,按順序一個一個元素往下解析,佔用內存小,解析速度快,只適合作文檔的讀取,不適合作文檔的CRUD,適合解析大文件)

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

[obj perforSelectorOnMainThread:]   回到主線程就是刷新界面,UI交互只能在主線程

28.iphone閱讀器,若是要讀取一個文本文件,請問你是如何處理編碼問題的?另外像pdf格式的文件,你如何讀取?phone手機閱讀器中對於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;

29.你在開發大型項目的時候,如何進行內存泄露檢測的?

能夠經過xcode的自帶工具run---start with performance tool裏有instruments下有個leaks工具,啓動此工具後,運行項目,工具裏能夠顯示內存泄露的狀況,雙擊可找到源碼位置,能夠幫助進行內存泄露的處理。

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

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

四種方式:1. beginAnimation  2線程 3. NSTimer 4. 圖層動畫(路徑)

32.你瞭解哪些加密方式?MD5;Base64;循環右移位等

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

MKMapView提供了一套可植入的地圖接口,可讓咱們在應用中展現地圖,並對其進行相關的操做。通常來講,咱們能夠指定一個展現區域,放一些標記在上面,還能夠加蓋一些層在上面。

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

34.圖片瀏覽UIImagePickerController能夠從相冊,相機,膠捲裏得到圖片。

35.對象序列化  NSCoding encodeWithcoder  initWithCoder

               NSKeyedUnarchiver   NSKeyedArchiver

36.線程? NSThread

37.各類排序算法?冒泡排序;快速排序;希爾排序

38.通訊底層原理   

OSI七層模型:1物理層  2數據鏈路層:STP,VT 3網絡層:IP 4傳輸層:tcp,udp  5會話層 6表現層 7應用層:FTP,http

39.在一個對象的方法裏面:self.name = 「object」;和name =」object」有什麼不一樣嗎?  self.name = "object"會調用對象的setName()方法,會使object引用計數加1,name = "object"會直接把object賦值給當前對象的name 屬性,引用計數不增長。

 40.什麼是目標-動做機制

目標是動做消息的接收者。一個控件,或者更爲常見的是它的單元,以插座變量(參 見"插座變量"部分)
的形式保有其動做消息的目標。動做是控件發送給目標的消息,或者從目標的角度看,它是目標爲了響應動做而實現 的方法。程序須要某些機制來進行事件和指令的翻譯。這個機制就是目標-動做機制。

41.請列舉你熟悉cocoatouch框架(至少三個)

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

42.什麼是面向對象?類,對象,成員變量,成員方法

類的定義要實現接口(定義類的成員變量和方法)和實現(引入頭文件,實現抽象方法)2個部分;對象定義;建立對象;方法調用;對象和變量。

43.類變量的@protected, @private,@public, @package聲明各有什麼含義

答:@protected 該類和全部子類中的方法能夠直接訪問這樣的變量。

      @private 該類中的方法能夠訪問,子類不能夠訪問。

      @public   能夠被全部的類訪問

      @package 本包內使用,跨包不能夠

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

45.類工廠方法是什麼?(1)類工廠方法的實現是爲了向客戶提供方便,它們將分配和初始化合在一個步驟中, 返回被建立的對象,並
進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。(2)工廠方法可能不只僅爲了方便使用。它們不但能夠將分配和初始化合在一塊兒,還能夠 爲初始化過程提供對
象的分配信息。(3)類工廠方法的另外一個目的是使類(好比NSWorkspace)提供單件實例。雖 然init...方法能夠確認一
個類在每次程序運行過程只存在一個實例,但它須要首先分配一個「生的」實例,而後還必須釋放該實例。
工廠 方法則能夠避免爲可能沒有用的對象盲目分配內存。

46. main() {  

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));}答案:25 解析: *(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

47.什麼叫動態綁定?將調用方法的肯定也推遲到運行時。在編譯時,方法的調用並不和代碼綁定 在一塊兒,只有在消實發送出來以後,才肯定被調用的代碼。經過動態類型和動態綁定技術,您的代碼每次執行均可以獲得不一樣的結果。運行時因子負責肯定消息的接 收者和被調用的方法。 運行時的消息分發機制爲動態綁定提供支持。當您向一個動態類型肯定了的對象發送消息時,運行環境系統會經過接收者的isa指針定位對象的類,並以此爲起點 肯定被調用的方法,方法和消息是動態綁定的。並且,您沒必要在Objective-C 代碼中作任何工做,就能夠自動獲取動態綁定的好處。您在每次發送消息時,特別是當消息的接收者是動態類型已經肯定的對象時,動態綁定就會例行而 透明地發生。

48. notification是同步仍是異步? kvo是同步仍是異步?notification是全進程空間的通知嗎?kvo呢?都是同步。KVO,只要是本身監控的 keyPath屬性發生改變,就會當即回調observeValueForKeyPath,其實就是跟內部調用了一個函數是同樣的。NSNotification也是如此,在發生postNotificationName的時候,defaultCenter就回去回調相應的observe,也是同步進行的,可能回調的時候須要尋找全部的observes,而後肯定當前,是須要費時a little的。

delegate更不用說了,更是直接回調相應的函數,必須是同步的。

雖然他們都是同步執行的,可是能夠在回調的函數裏面實現異步操做,上述代碼中,對於notification,就異步打印,徹底是能夠作到的。

49  NSObject 中description屬性的意義,它能夠重寫嗎?能夠。

50.  爲NSString擴展一個方法,方法能判斷字符串是不是Url地址(即判斷字符串是否以「http://」),放回BOOL值類型

51. 獲取一臺設備惟一標示的方法有哪些?  

 1.UDID 

 2.UUID 

 3.MAC ADDRESS  

 4.OPEN UDID   5.廣告標識符          

 6.Vindor標示符 

 7.ios7以後用的時keychain(鑰匙串)

52.  寫一個Objective C中定義及使用委託的例子

53. 定義一個Block並寫一個應用例子,若是對變量加上_block的表示,有什麼意義。

54.寫一個簡單的Objective C中的類的繼承示例

55.Xcode5.0中的新特性有哪些?自動配置;測試導航器;用於連續集成的Bot;自動佈局;資產管理;調式儀表板;Xcode 可視化調試器;源代碼控制。

56.發佈程序和真機調試的步驟?

發佈程序步驟:1登錄開發者主頁;2生成cer證書;3添加APPID;4生成MobileProvision文件;5導入cer. MobileProvision文件;6填寫應用信息;7配置證書;8打包上傳程序。真機調試步驟: 1登錄開發者主頁;2生成cer證書;3添加APPID;4註冊真機設備;5生成MobileProvision文件;6導入cer. MobileProvision文件;7替換舊的證書。

57  寫一個iphone程序,有2屏,能夠經過滑動切換,第二屏有一個webview,讀取本地的html文件,Html文件中會加載一個本地xml文件,獲取xml文件中的數據內容並顯示。(可選:html中加載的js文件)

58.drawRect方法何時調用 當view第一次顯示到屏幕上時調用

59.js(javaSclite)和webview如何交互

60.框架phonegap

61.地圖中怎麼計算兩點間的曲線距離

62.定位不許如何優化

63. UIView 和CALayer 有什麼區別?二者最大的區別是,圖層不會直接渲染到屏幕

64. UITableViewController 中,建立UITableViewCellinitWithSytle:resuseIdentifier 中,reuseIdentifier有什麼用?簡述UITableViewCell的複用原理.複用隊列的元素增長:只有在cell被滑動出界面的時候,此cell纔會被加入到複用隊列中。每次在建立cell的時候,程序會首先經過調用dequeueReusableCellWithIdentifier:cellType方法,到複用隊列中去尋找標示符爲「cellType」的cell,若是找不到,返回nil,而後程序去經過調用[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]來建立標示符爲「cellType」的cell。

65. ViewController 的 didReceiveMemoryWarning 是在何時被調用的?UIViewController類中didReceiveMemoryWarning默認的操做是什麼?默認調用[super didReceiveMemoryWarning]

66. 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。

67.ios平臺怎麼作數據的持久化?coredata和sqlite有無必然聯繫?coredata是一個關係型數據庫嗎?

iOS中能夠有4種持久化數據的方式:plist 屬性列表、對象歸檔、SQLite3和Core Data。數據的持久化本質上就是寫文件,但從邏輯上又分紅不少種,好比寫入沙盒(實際上是一個本應用程序才能夠訪問的路徑),好比存到網絡上,好比寫入數據庫。SQLite,它是一個輕量級功能強大的嵌入式關係數據庫引擎,也很容易嵌入到應用程序,能夠在多個平臺使用,與core data框架不一樣的是,sqlite是使用程序式,sql的主要API直接操做數據表。Core data與sqlite仍是有聯繫的,core data 是對sqlite的封裝,由於sqlite是c語言的api,然而有人也須要obj-c 的api,因此有了 core data ,另外,core data還提供了一些管理的功能,使用更加方便。

Core Data不是一個關係型數據庫,也不是關係型數據庫管理系統,雖然Core Dta支持SQLite做爲一種存儲類型,但它不能使用任意的SQLite數據庫。Core Data在使用的過程本身建立數據庫,支持對一對多的關係。

68.unix上進程怎麼通訊?

 UNIX主要支持三種通訊方式:

1. 基本通訊:主要用來協調進程間的同步和互斥

   (1)鎖文件通訊

    通訊的雙方經過查找特定目錄下特定類型的文件(稱鎖文件)來完成進程間  對臨界資源訪問時的互斥;例如進程p1訪問一個臨界資源,首先查看是否有一個特定類型文件,如有,則等待一段時間再查找鎖文件。

   (2)記錄鎖文件

   2. 管道通訊:適應大批量的數據傳遞

   3. IPC:適應大批量的數據傳遞

 

69.UIscrollVew用到了什麼設計模式?還能再foundation庫中找到相似的嗎?

模板(Template)模式,全部datasource和delegate接口都是模板模式的典型應用,

組合模式composition,全部的container view都用了這個模式

觀察者模式observer,全部的UIResponder都用了這個模式。

71. 堆和棧的區別

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

申請大小:
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。堆:堆是向高地址擴展的數據結構,是不連續的內存區域。因而可知,堆得到的空間比較靈活,也比較大。

碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個 問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由 alloca函數進行分配,棧的動態分配是由編譯器進行釋放,無需咱們手工實現。

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

72. 自動釋放池是什麼,如何工做?

1》 ojc-c 是經過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數爲1,之後每當碰到有copy,retain,new的時候引用計數都會加1, 每當碰到release和autorelease的時候引用計數就會減1,若是此對象的計數變爲0, 就會被系統銷燬.
2》 NSAutoreleasePool 就是用來作引用計數的管理工做的,這個東西通常不用你管的.
3. autorelease和release沒什麼區別,只是引用計數減1的時機不一樣而已,autorelease會在對象的使用真正結束的時候才作引用計數減1。

73.  ObjC中,與alloc語義相反的方法是dealloc仍是release?與retain語義相反的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?

retain對應的是release,內存的釋放用release。

alloc對應的是dealloc,內存的銷燬用dealloc。

74Objective C中的selector 是什麼?

你能夠理解 @selector()就是類方法的編號,他的行爲基本能夠等同C語言的中函數指針,只不過C語言中,能夠把函數名直接賦給一個函數指針,而Objective-C的類不能直接引用函數指針,這樣只能作一個@selector語法來取. 它的結果是一個SEL類型。這個類型本質是類方法的編號(函數地址)。

75. Objective C中的category是什麼?

類別是對一個已經存在的類添加方法(Methods)。你只須要知道這個類的公開接口,不須要知道類的源代碼。須要注意的是,類別不能爲已存在的類添加實例(成員)變量或擴充方法。

類別最主要的優勢是:系統中已經存在的類能夠不需修改就可以使用類別的擴展功能。

類別的第二大優勢是實現了功能的局部化封裝。類別定義能夠放在一個已存在的類的定義文件中(.h)。這意味着這個類別只有在類A被引用的前提下才會被外部看到。若是另外一個類不須要用到類A的功能,也就不會看到依附類A存在的類別。

76. 什麼是Notification?何時用delegate,何時用Notification?

觀察者模式,controller向defaultNotificationCenter添加本身的notification,其餘類註冊這個notification就能夠收到通知,這些類能夠在收到通知時作本身的操做(多觀察者默認隨機順序發通知給觀察者們,並且每一個觀察者都要等當前的某個觀察者的操做作完才能輪到他來操做,能夠用NotificationQueue的方式安排觀察者的反應順序,也能夠在添加觀察者中設定反映時間,取消觀察須要在viewDidUnload 跟dealloc中都要註銷)。

delegate針對one-to-one關係,而且reciever能夠返回值給sender,notification 能夠針對one-to-one/many/none,reciever沒法返回值給sender.因此,delegate用於sender但願接受到reciever的某個功能反饋值,notification用於通知多個object某個事件。

77關鍵字volatile有什麼含意?並給出三個不一樣的例⼦:
⼀個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在⽤到這個變量時必須每次都⼩⼼地從新讀取這個變量的值,⽽不是使⽤保存在寄存器⾥的備份。下⾯是volatile變量的⼏個例⼦:
• 並⾏設備的硬件寄存器(如:狀態寄存器)
• ⼀箇中斷服務⼦程序中會訪問到的⾮⾃動變量(Non-automatic variables)
• 多線程應⽤中被⼏個任務共享的變量

78⼀個參數既能夠是const還能夠是volatile嗎?解釋爲何。
⼀個指針能夠是volatile 嗎?解釋爲何。
下⾯是答案:
• 是的。⼀個例⼦是隻讀的狀態寄存器。它是volatile由於它可能被意想不到地改變。它是const由於程序不該該試圖去修改它。
• 是的。儘管這並不很常⻅。⼀個例⼦是當⼀箇中服務⼦程序修該⼀個指向⼀個buffer的指針時。

79@synthesize 是系統⾃動⽣成getter和setter屬性聲明
  @dynamic 是開發者⾃已提供相應的屬性聲明

80 TCP/UDP區別聯繫

TCP提供的是面向鏈接的、可靠的數據流傳輸,而UDP提供的是非面向鏈接的、不可靠的數據流傳輸。簡單的說,TCP注重數據安全,而UDP數據傳輸快點,但安全性通常

81 SOCKET和HTTP通訊的區別
1http是客戶端用http協議進行請求,發送請求時候須要封裝http請求頭,並綁定請求的數據,服務器通常有web服務器配合(固然也非絕對)。 http請求方式爲客戶端主動發起請求,服務器才能給響應,一次請求完畢後則斷開鏈接,以節省資源。服務器不能主動給客戶端響應(除非採起http長鏈接技術)。iphone主要使用類是NSUrlConnection

2scoket是客戶端跟服務器直接使用socket「套接字」進行鏈接,並無規定鏈接後斷開,因此客戶端和服務器能夠保持鏈接通道,雙方均可以主動發送數據。通常在遊戲開發或股票開發這種要求即時性很強而且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef

3TCP全稱是Transmission Control Protocol,中文名爲傳輸控制協議,它能夠提供可靠的、面向鏈接的網絡數據傳遞服務。傳輸控制協議主要包含下列任務和功能:

確保IP數據報的成功傳遞。

對程序發送的大塊數據進行分段和重組。

確保正確排序及按順序傳遞分段的數據。

經過計算校驗和,進行傳輸數據的完整性檢查。

82  xib 與nib 本質區別。

 

xib是面向咱們開發人員描述視圖的文件。Xib的本質仍是會轉換成代碼。

 

nib是當程序運行的時候,會將xib轉換成nib。

相關文章
相關標籤/搜索