51.UIscrollVew用到了什麼設計模式?還能再foundation庫中找到相似的嗎?(答案衆多,不知道哪一個是對的~~)html
模板(Template)模式,全部datasource和delegate接口都是模板模式的典型應用,java
組合模式composition,全部的containerview都用了這個模式ios
觀察者模式observer,全部的UIResponder都用了這個模式。c++
53. 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].
54. 如下爲Windows NT下的32位C++程序,請計算sizeof的值 voidFunc ( char str[100] ) { sizeof( str ) =? } void *p = malloc( 100 ); sizeof ( p ) = ?
答案:這題 很常見了,Func( char str[100] )函數中數組名做爲函數形參時,在函數體內,數組名失去了自己的內涵,僅僅只是一個指針;在失去其內涵的同時,它還失去了其常量特性,能夠做自增、自減等操做,能夠被修改。Windows NT 32位平臺下,指針的長度(佔用內存的大小)爲4字節,故sizeof( str ) 、sizeof( p ) 都爲4。
56.列舉幾種進程的同步機制,並比較其優缺點。
答案: 原子操做信號量機制 自旋鎖 管程,會合,分佈式系統
進程之間通訊的途徑
答案:共享存儲系統消息傳遞系統管道:以文件系統爲基礎
進程死鎖的緣由
答案:資源競爭及進程推動順序非法
死鎖的4個必要條 件
答案:互斥、請求保持、不可剝奪、環路
死鎖的處理
答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
57.堆和棧的區別
管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leak。
申請大小: 棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示overflow。所以,能從棧得到的空間較小。 堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。
碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個 問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們手工實現。
分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。
59.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.
60.目標-動做機制
目標是動做消息的接收者。一個控件,或者更爲常見的是它的單元,以插座變量(參見"插座變量"部分) 的形式保有其動做消息的目標。
動做是控件發送給目標的消息,或者從目標的角度看,它是目標爲了響應動做而實現的方法。
程序須要某些機制來進行事件和指令的翻譯。這個機制就是目標-動做機制。
-(void)addTarget:(id)target action:(SEL) forControlEvents:(UIControlEvents)controlEvents
62.objc的內存管理
若是您經過分配和初始化(好比[[MyClass alloc] init])的方式來建立對象,您就擁 有這個對象,須要負責該對象的釋放。這個規則在使用NSObject的便利方法new 時也一樣適用.
若是您拷貝一個對象,您也擁有拷貝獲得的對象,須要負責該對象的釋放.
若是您保持一個對象,您就部分擁有這個對象,須要在再也不使用時釋放該對象。
若是您從其它對象那裏接收到一個對象,則您不擁有該對象,也不該該釋放它(這個規則有少數 的例外,在參考文檔中有顯式的說明)。
63.自動釋放池是什麼,如何工做
當您向一個對象發送一個autorelease消息時,Cocoa就會將該對 象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,所以自動釋放池定義的做用域內的其它對象能夠向它發送消息。當程序執行到做用域結束的位置時,自動釋放池就會被釋放,池中的全部對象也就被釋放。
1. ojc-c 是經過一種"referringcounting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數爲一,之後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,若是此對象的計數變爲了0, 就會被系統銷燬. 2. NSAutoreleasePool 就是用來作引用計數的管理工做的,這個東西通常不用你管的. 3. autorelease和release沒什麼區別,只是引用計數減一的時機不一樣而已,autorelease會在對象的使用真正結束的時候才作引用計數減一.
64.類工廠方法是什麼
類工廠方法的實現是爲了向客戶提供方便,它們將分配和初始化合在一個步驟中, 返回被建立的對象,並 進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。
工廠方法可能不只僅爲了方便使用。它們不但能夠將分配和初始化合在一塊兒,還能夠爲初始化過程提供對 象的分配信息。
類工廠方法的另外一個目的是使類(好比NSWorkspace)提供單件實例。雖 然init...方法能夠確認一 個類在每次程序運行過程只存在一個實例,但它須要首先分配一個「生的」實例,而後還必須釋放該實例。 工廠 方法則能夠避免爲可能沒有用的對象盲目分配內存。
65.單件實例是什麼
Foundation和Application Kit 框架中的一些類只容許建立單件對象,即這些類在當前進程中的惟一實例。舉例來講,NSFileManager和NSWorkspace 類在使用時都是基於進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,若是該實例還不存在,則首先進行實例的分配和初始化。 單件對象充當控制中心的角色,負責指引或協調類的各類服務。若是類在概念上只有一個實例(好比 NSWorkspace),就應該產生一個單件實例,而不是多個實例;若是未來某一天可能有多個實例,您可 以使用單件實例機制,而不是工廠方法或函數。
67.obj-c的優缺點
objc優勢: 1)Cateogies 2) Posing 3) 動態識別 4) 指標計算 5)彈性訊息傳遞 6) 不是一個過分複雜的 C 衍生語言 7) Objective-C 與 C++ 可混合編程
缺點: 1) 不支援命名空間 2) 不支持運算符重載
3) 不支持多重繼承
4) 使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優化方法都用不到。(如內聯函數等),性能低劣。
68.readwrite,readonly,assign,retain,copy,nonatomic 屬性的做用?
@property是 一個屬性訪問聲明,擴號內支持如下幾個屬性: 1,getter=getterName,setter=setterName,設置setter與 getter的方法名 readwrite,readonly,設置可供訪問級別 2,assign,setter方法直接賦值,不進行 任何retain操做,爲了解決原類型與環循引用問題 3,retain,setter方法對參數進行release舊值再retain新值,全部 實現都是這個順序(CC上有相關資料) 4,copy,setter方法進行Copy操做,與retain處理流程同樣,先舊值release,再 Copy出新的對象,retainCount爲1。這是爲了減小對上下文的依賴而引入的機制。 5,nonatomic,非原子性訪問,不加同步, 多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的…)。
69.ViewController的 didReceiveMemoryWarning 是在何時被調用的?(87題)
答:已經收到內存警告
70.談談你對ARC 的認識和理解?
答:
Automatic Reference Counting,自動引用計數,即ARC,能夠說是WWDC2011和iOS5所引入的最大的變革和最激動人心的變化。ARC是新的LLVM 3.0編譯器的一項特性,使用ARC,能夠說一舉解決了廣大iOS開發者所憎恨的手動內存管理的麻煩。
在工程中使用ARC很是簡單:只須要像往常那樣編寫代碼,只不過永遠不寫retain
,release
和autorelease
三個關鍵字就好~這是ARC的基本原則。當ARC開啓時,編譯器將自動在代碼合適的地方插入retain
, release
和autorelease
,而做爲開發者,徹底不須要擔憂編譯器會作錯(除非開發者本身錯用ARC了)。好了,ARC至關簡單吧~到此爲止,本教程結束。
71. ObjC中,與alloc語義相反的方法是dealloc仍是release?與retain語義相反的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?
alloc與dealloc語意相反,alloc是建立變量,dealloc是釋放變量。 retain 對應release,retain 保留一個對象。調用以後,變量的計數加1。或許不是很明顯,在這有例爲證:
- (void)setName : (NSString*) name {
[name retain];
[myname release];
myname = name; }
咱們來解釋一下:設想,用戶在調用這個函數的時候,他注意了內存的管理,因此他當心的寫了以下代碼:
NSString* newname = [[NSString alloc] initWithString: @"John"];
[aClass setName: newname];
[newname release];
咱們來看一看newname的計數是怎麼變化的。首先,它被alloc,count = 1; 而後,在setName中,它被retain,count = 2; 最後,用戶本身釋放newname,count= 1,myname指向了newname。這也解釋了爲何須要調用[myname release]。咱們須要在給myname賦新值的時候,釋放掉之前老的變量。retain 以後直接dealloc對象計數器沒有釋放。alloc 須要與release配對使用,由於alloc 這個函數調用以後,變量的計數加1。因此在調用alloc 以後,必定要調用對應的release。另外,在release一個變量以後,他的值仍然有效,因此最好是後面緊接着再var = nil。
74. 什麼是retaincount?
答:對象引用計數
75. 如下每行代碼執行後,person對象的retain count分別是多少
Person *person = [[Person alloc] init]; 1
[person retain]; 2
[person release]; 1
[person release]; 0
76. 爲何不少內置類如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模式時,也要注意這點。
77. 定義屬性時,什麼狀況使用copy,assign,和retain?
assign用於簡單數據類型,如NSInteger,double,bool,retain和copy用戶對象,copy用於當 a指向一個對象,b也想指向一樣的對象的時候,若是用assign,a若是釋放,再調用b會crash,若是用copy 的方式,a和b各自有本身的內存,就能夠解決這個問題。retain 會使計數器加一,也能夠解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果。加了atomic,setter函數會變成下面這樣:
if(property != newValue) { [propertyrelease]; property = [newValueretain]; }
78. autorelease的對象是在何時被release的?
答:autorelease實際上只是把對release的調用延遲了,對於每個Autorelease,系統只是把該Object放入了當前的Autoreleasepool中,當該pool被釋放時,該pool中的全部Object會被調用Release。對於每個Runloop,系統會隱式建立一個Autoreleasepool,這樣全部的releasepool會構成一個象CallStack同樣的一個棧式結構,在每個Runloop結束時,當前棧頂的Autoreleasepool會被銷燬,這樣這個pool裏的每一個Object(就是autorelease的對象)會被release。那什麼是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。那什麼是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。
81. Objective C中的protocal是什麼?
@protocal obj裏面的協議就如同java裏面的interface。
82. Objective C中的selector 是什麼?
你能夠理解 @selector()就是取類方法的編號,他的行爲基本能夠等同C語言的中函數指針,只不過C語言中,能夠把函數名直接賦給一個函數指針,而Objective-C的類不能直接應用函數指針,這樣只能作一個@selector語法來取.它的結果是一個SEL類型。這個類型本質是類方法的編號(函數地址)。
83. Objective C中的category是什麼?
Objective-C提供了一個很是靈活的類(Class)擴展機制-類別(Category)。類別用於對一個已經存在的類添加方法(Methods)。你只須要知道這個類的公開接口,不須要知道類的源代碼。須要注意的是,類別不能爲已存在的類添加實例變量(Instance Variables)。
子類(subclassing)是進行類擴展的另外一種經常使用方法。與子類相比,類別最主要的優勢是:系統中已經存在的類能夠不需修改就可以使用類別的擴展功能。
類別的第二大優勢是實現了功能的局部化封裝。類別定義能夠放在一個已存在的類(類A)的定義文件中(.h)。這意味着這個類別只有在類A被引用的前提下才會被外部看到。若是另外一個類(類B)不須要用到類A的功能(沒有包含類A的.h文件),也就不會看到依附類A存在的類別。iOS SDK中普遍運用這種類別定義法來封裝功能。
84. 什麼是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某個事件。
86. ViewController 的 loadView,viewDidLoad, viewDidUnload 分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?
ViewController生命週期
alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc
注意viewWillUnload和viewDidUnload已經在ios6被廢棄了,由於Clearing references to views is no longer necessary。
注意1.沒有viewWillLoad。
注意2.viewDidLoad和viewDidUnload並非成對的。
87. ViewController 的didReceiveMemoryWarning 是在何時被調用的?UIViewController類中didReceiveMemoryWarning默認的操做是什麼?
答:默認調用[superdidReceiveMemoryWarning]
88. UITableViewController 中,建立UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什麼用?簡述UITableViewCell的複用原理.
複用隊列的元素增長:只有在cell被滑動出界面的時候,此cell纔會被加入到複用隊列中。每次在建立cell的時候,程序會首先經過調用dequeueReusableCellWithIdentifier:cellType方法,到複用隊列中去尋找標示符爲「cellType」的cell,若是找不到,返回nil,而後程序去經過調用[[[UITableViewCell alloc]initWithStyle:style reuseIdentifier:cellType] autorelease]來建立標示符爲「cellType」的cell。
89. UIView 和CALayer 有什麼區別?
總接來講就是以下幾點:
每一個 UIView 內部都有一個 CALayer 在背後提供內容的繪製和顯示,而且 UIView 的尺寸樣式都由內部的 Layer 所提供。二者都有樹狀層級結構,layer 內部有 SubLayers,View 內部有 SubViews.可是 Layer 比 View 多了個AnchorPoint
在 View顯示的時候,UIView 作爲 Layer 的 CALayerDelegate,View 的顯示內容由內部的 CALayer 的 display
CALayer 是默認修改屬性支持隱式動畫的,在給 UIView 的 Layer 作動畫的時候,View 做爲 Layer 的代理,Layer 經過 actionForLayer:forKey:向 View請求相應的 action(動畫行爲)
layer 內部維護着三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在作 iOS動畫的時候,咱們修改動畫的屬性,在動畫的實際上是 Layer 的 presentLayer的屬性值,而最終展現在界面上的實際上是提供 View的modelLayer
二者最明顯的區別是 View能夠接受並處理事件,而 Layer 不能夠
4.寫一個setter方法用於完成@property (nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name
6.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;NSInteger是基本數據類型,並非NSNumber的子類,固然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位仍是64位來決定是自己是int仍是Long。
10.如何對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
11.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 爲何?
str的retainCount建立+1,retain+1,加入數組自動+1
3
retain+1,release-1,release-1
2
數組刪除全部對象,全部數組內的對象自動-1
1
12. Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?
線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:
在應用中能夠建立多少autorelease對象,是否有限制?
答案:無
若是咱們不建立內存池,是否有內存池提供給咱們?
答案:界面線程維護着本身的內存池,用戶本身建立的數據線程,則須要建立該線程的內存池
何時須要在程序中建立內存池?
答案:用戶本身建立的數據線程,則須要建立該線程的內存池
答案:見iOS面試題(一)
什麼是簡便構造方法?
答案:簡便構造方法通常由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
1 談談對Block 的理解?並寫出一個使用Block執行UIVew動畫?
答案:Block是能夠獲取其餘函數局部變量的匿名函數,其不但方便開發,而且能夠大幅提升應用的執行效率(多核心CPU可直接處理Block指令)
2 寫出上面代碼的Block的定義。
答案:
typedef void(^animations) (void);
typedef void(^completion) (BOOL finished);
3 試着使用+ beginAnimations:context:以及上述Block的定義,寫出一個能夠完成
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);操做的函數執行部分
3 作過的項目是否涉及網絡訪問功能,使用什麼對象完成網絡功能?
4 簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的區別?
答案: NSURLConnection主要用於網絡訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數據,即當前線程會阻塞,並等待request的返回的response,而– initWithRequest:delegate:使用的是異步加載,當其完成網絡訪問後,會經過delegate回到主線程,並其委託的對象。
1 多線程是什麼