100道iOS面试题
面試題:
1__weak什么時候用
想要在block內部變外部變量需要加__weak或者__block
2.是否使用過coreImage和coreText?如果使用過,說說你的體驗(答案在另一份)
3.什么是IP,HTTP,TCP、UDP等協議?他們分別屬于第幾層?
IP屬于網絡層(第三層);TCP和UDP都屬于傳輸層(第四層);HTTP屬于應用層(第七層)。
IP協議保證計算機發送和接收分組數據,負責將消息從一個主機傳送到另一個主機。
HTTP協議是超文本傳輸協議,規定客戶端和服務器之間的數據傳輸格式,讓客戶端和服務器能有效進行數據溝通。
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個文件夾:documents,tmp,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通信的區別
(1)http是客戶端用http協議進行請求,發送請求時候需要封裝http請求頭,并綁定請求的數據,服務器一般有web服務器配合(當然也非絕對)。?http請求方式為客戶端主動發起請求,服務器才能給響應,一次請求完畢后則斷開連接,以節省資源。服務器不能主動給客戶端響應(除非采取http長連接技術)。iphone主要使用類是NSUrlConnection。
(2)scoket是客戶端跟服務器直接使用socket“套接字”進行連接,并沒有規定連接后斷開,所以客戶端和服務器可以保持連接通道,雙方都可以主動發送數據。一般在游戲開發或股票開發這種要求即時性很強并且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。
(3)TCP全稱是Transmission?Control?Protocol,中文名為傳輸控制協議,它可以提供可靠的、面向連接的網絡數據傳遞服務。傳輸控制協議主要包含下列任務和功能:
*?確保IP數據報的成功傳遞。
*?對程序發送的大塊數據進行分段和重組。
*?確保正確排序及按順序傳遞分段的數據。
*?通過計算校驗和,進行傳輸數據的完整性檢查。
82??xib?與nib?本質區別。
?
xib是面向我們開發人員描述視圖的文件。Xib的本質還是會轉換成代碼。
?
nib是當程序運行的時候,會將xib轉換成nib。
?
轉載于:https://www.cnblogs.com/linxiu-0925/p/5055382.html
總結
以上是生活随笔為你收集整理的100道iOS面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学校食堂简易点餐管理系统(含用户登录且密
- 下一篇: 渗透测试笔试面试题目汇总