1. Objective-c的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?java
OC不能多繼承,可是能夠經過實現多個接口達到多繼承的目的。Category是分類。重寫一個類固然是用繼承好,分類主要用途是擴展類。git
2. #import 跟#include 又什麼區別,@class呢, #import<> 跟 #import」"又什麼區別?程序員
#import是OC導入頭文件的關鍵字,#include是C++導入頭文件的關鍵字。#import頭文件會自動只導入一次,不會重複導入。@class是告訴編譯器某個類的聲明,運行時,纔會去查看類的實現文件,能夠解決頭文件的相互包含。github
3. 屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?web
readwrite:是可讀可寫特性。須要生成getter方法和setter方法時使用。面試
readonly:是隻讀特性。只須要生成getter方法時使用。objective-c
assign:是賦值特性,setter方法將傳入參數賦值給實例變量,不改變索引計數。算法
retain:表示持有特性,setter方法將傳入參數先保留,而後釋放掉舊的對象,再賦值,傳入參數的retaincount會+1。sql
copy:表示拷貝特性,創建一個索引計數爲1的對象,釋放舊對象,再賦值。數據庫
nonatomic和atomic:atomic是Objc使用的一種線程保護技術,基本上來說,是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤。而這種機制是耗費系統資源的,因此在iPhone這種小型設備上,若是沒有使用多線程間的通信編程,那麼nonatomic是一個很是好的選擇。
4.寫一個setter方法用於完成@property (nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name。
1 - (void) setName:(NSString *)str 2 { 3 [str retain]; 4 [name release]; 5 name = str; 6 }
1 - (void)setName:(NSString *)str 2 { 3 id tmp = [str copy]; 4 [name release]; 5 name = tmp; 6 }
5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?
編譯時是NSString的類型,運行時是NSData類型的對象。
6.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象。C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位仍是64位來決定是自己是int仍是Long。
7.id 聲明的對象有什麼特性?
id 聲明的對象具備運行時的特性,便可以指向任意類型的objcetive-c對象;
8.Objective-C如何對內存管理的,說說你的見解和解決方法?
Objective-C的內存管理主要有三種方式:自動垃圾收集、手工引用計數和自動釋放池、ARC(自動引用計數)。
9.內存管理的幾條原則時什麼?按照默認法則,哪些關鍵字生成的對象須要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?
原則:本身持有的對象再也不須要時要釋放;非本身持有的對象沒法釋放;內存管理主要要避免「過早釋放」和「內存泄漏」。
用alloc/new/copy/mutableCopy關鍵字生成的對象須要手動釋放。
設置正確的property屬性,好比__weak,避免循環引用從而避免內存泄漏。
10.如何對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
11.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 爲何?
1 NSMutableArray *ary = [[NSMutableArray array] retain]; 2 NSString *str = [NSString stringWithFormat:@"test"]; 3 [str retain]; 4 [ary addObject:str]; 5 NSLog(@"%@%d",str,[str retainCount]); 6 [str retain]; 7 [str release]; 8 [str release]; 9 NSLog(@"%@%d",str,[str retainCount]); 10 [ary removeAllObjects]; 11 NSLog(@"%@%d",str,[str retainCount]);
第一個NSLog:3(str的retainCount建立+1,retain+1,加入數組自動+1)。
第二個:2(retain+1,release-1,release-1)。
第三個:1(數組刪除全部對象,全部數組內的對象自動-1)。
12. Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?
線程建立有三種方法:使用NSThread建立、使用 GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue。
在主線程執行代碼,方法是 performSelectorOnMainThread,或者GCD中的dispatch_get_main_queue();若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:,或者GCD中的dispatch_after()。
13.描述一下iOS SDK中如何實現MVC的開發模式
MVC是模型、視圖、控制器開發模式,對於iOS SDK,全部的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。全部的用戶數據都是模型層,它應該獨立於視圖。全部的ViewController都是控制層,由它負責控制視圖,訪問模型數據。
1. 淺複製和深複製的區別?
簡單來講,淺複製是指只複製對象的地址,新變量和舊變量操做同一個對象;深複製是指複製了對象自己,新變量和舊變量操做兩個對象。
用網上一哥們通俗的話將就是:
淺複製比如你和你的影子,你完蛋,你的影子也完蛋
深複製比如你和你的克隆人,你完蛋,你的克隆人還活着。
2. 類別的做用?繼承和類別在實現中有何區別?
類別主要是用來擴展類。實現中,繼承能夠在子類中增長、修改、刪除方法,可是類別只能在原有類的基礎上添加方法。
3. 類別和類擴展的區別。
category和extensions的不一樣在於後者能夠直接添加屬性,前者要添加對象須要用到關聯對象。後者添加的方法是必需要實現的。前者的聲明部分和實現部分能夠分爲不一樣的文件,然後者聲明和實現必須放在同一個文件中。
extensions能夠認爲是一個私有的Category。
4. oc中的協議和java中的接口概念有何不一樣?
OC中的協議有2層含義,官方定義爲 formal protocol(正式協議)和informal protocol(非正式協議)。前者和java中的接口同樣,裏面規定的方法要求必須實現,後者規定的方法對於方法的實現沒有硬性要求。也能夠說後者是個抽象類。
5. 什麼是KVC和KVO?
KVC,便是指NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問對象的屬性。
KVO,創建在KVC基礎之上,可以觀察一個對象的 KVC key path 值的變化。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會通知相應的觀察者了。
6. 代理的做用?
代理的目的是改變或傳遞控制鏈。其實就是把事情委託給別人去作,舉個栗子:
我上班的工做主要內容包括 (1)寫代碼(2)寫文檔(3)測試程序(4)接電話(5)會見客戶
(1)(2)我本身全權負責,可是後面(3)(4)(5)我不想或者不方便本身作,因此我想找個助手(delegate)幫我作這些事,因而我定了一個招聘要求(Protocol),裏寫明個人助手須要會作(3)(4)(5)這三件事。很快,我招到一個助手。
即:我.delegate = 助手;
因而之後每當我遇到須要測試程序或者接電話的活,我就把他轉交給助手(delegate)去處理,助手處理完後若是有處理結果(返回值)助手會告訴我,也許我會拿來用。若是不須要或者沒有結果,我就接着作下面的事。
我不關心誰來實現委託,我只關心委託是否能實現。
7. oc中什麼是可修改和不能夠修改類型?
可修改類型是指初始化以後能夠動態進行修改的,不可修改類型是指初始化以後不容許動態修改的。
8. 咱們說的oc是動態運行時語言是什麼意思?
主要是將數據類型的肯定由編譯時,推遲到了運行時。好比說肯定一個對象的類型。
9. 通知和協議的不一樣之處?
協議有控制鏈(has-a)的關係,通知沒有。簡單來講,一條通知能夠發給多個消息接受者,可是通知無論他們是如何處理這個通知的,只管傳遞。協議就不同了,協議是多個類共享的方法列表,它會管使用它的類是否實現了協議中的必須方法。
10. 什麼是推送消息?
消息推送是在互聯網上經過按期傳送用戶須要的信息來減小信息過載的一項技術。推送技術經過自動傳送信息給用戶,來減小用於網絡上搜索的時間。服務器主動push。
11. 什麼是多態?
不一樣對象對同一消息的不一樣響應。好比說動物和人都有eat的方法,可是對eat方法的響應不一樣。
12. 什麼是單例(singleton)?
單例模式就是隻有一個實例,確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,一個單例類能夠實如今不一樣的窗口之間傳遞數據。http://jobleeimay.blog.163.com/blog/static/212532289201302473652537/ 能夠去這個博客看看。
13. 什麼是響應鏈?
事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。
14. frame和bounds有什麼不一樣?
frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)
bounds指的是:該view在自己座標系統中 的位置和大小。(參照點是自己座標系統)
15. 方法和選擇器有何不一樣?
selector是一個方法的名字,method是一個組合體,包含了名字和實現。
16. OC裏有垃圾回收機制嗎?
很早以前的OC版本中有自動垃圾收集,如今已經不推薦使用了。基本上只有手動引用計數和自動釋放池。不知道arc算不算。
17. 什麼是NSOperation queue?
18. 什麼是延遲加載(lazy loading)?
就是在須要用到時才加載。
19. 是否能夠在一個視圖控制器中嵌入兩個tableview控制器?
不能夠,本質上來說,一個都不行,由於tableViewController自己就是一個視圖控制器。能夠在一個視圖控制器中添加兩個tableView視圖。
20. 一個tableView是否能夠關聯兩個不一樣的數據源?你會怎麼處理?
那些數據源方法只是讓咱們返回根據本身的須要去設置如相關的數據源。因此,應該是能夠關聯不一樣的數據源。。可是我尚未作過。
21. obj-c有私有方法嗎?是有變量呢?
objective-c - 類裏面的方法只有兩種, 靜態方法和實例方法. 這彷佛就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西。
@private能夠用來修飾私有變量,在Objective‐C中,全部實例變量默認都是私有的,全部實例方法默認都是公有的。
22. 關鍵字const有什麼含意?修飾類呢?static的做用?用於類呢?還有extern C的做用
const int a; a爲一個常整型數
int const a; 同上,a爲一個常整型數
const int *a; a爲指向常整型數的指針(即整型數不可修改,可是指針能夠)
int* const a; a爲指向整型數的常指針(即整型數能夠修改,可是指針不可修改)
int const *a const; a爲一個指向常整數的常指針
(1)函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,所以其值在下次調用時仍維持上次的值;
(2)在模塊內的 static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明它的模塊內;
(4)在類中的 static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝;
(5)在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的static 成員變量。
(1)被 extern "C"限定的函數或變量是 extern 類型的;
extern 是 C/C++語言中代表函數和全局變量做用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,
其聲明的函數和變量能夠在本模塊或其它模塊中使用。
(2)被 extern "C"修飾的變量和函數是按照 C 語言方式編譯和鏈接的;
23. 簡述堆和棧的區別
棧是編譯器自動管理,堆是程序員控制的。
棧是一塊連續的內存區域,是向低地址擴展的數據結構,堆是向高地址擴展的數據結構,是不連續的用鏈表存儲的。
管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leak。
1.申請大小:
棧: 在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示 overflow。所以,能從棧得到的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。
2.碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出
3.分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由 alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們手工實現。
4.分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。
1. 何時使用NSMutableArray,何時使用NSArray?
當須要在數組初始化後對數組進行動態修改時用NSMutableArray,當不容許數組初始化後被修改時用NSArray。NSArray是線程安全的,並且只是數組的內容不能被修改(如元素個數等),元素的內容是能夠被修改的。
2. 給出委託方法的實例,而且說出UITableVIew的Data Source方法。
UITableVIew的Data Source方法有:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
3. 在應用中能夠建立多少autorelease對象,是否有限制?
我以爲是沒有限制的。
4. 若是咱們不建立內存池,是否有內存池提供給咱們?
界面線程維護着本身的內存池,用戶本身建立的數據線程,則須要建立該線程的內存池。
5. 何時須要在程序中建立內存池?
用戶本身建立數據線程時,建立該線程的內存池。
6. 何時內存計數會增長?
調用alloc,copy,retain,添加進數組時會增長。
7. 類NSObject的哪些方法常常被使用?
經常使用的類方法有:alloc,class,description。對象方法有:init,dealloc。
8. 什麼是簡便構造方法?
簡便構造方法通常由CocoaTouch框架提供,如NSNumber類的+numberWithInt等等。
Foundation下大部分類均有簡便構造方法,咱們能夠經過簡便構造方法,得到系統給咱們建立好的對象,而且不須要手動釋放。
9. 如何使用Xcode設計通用應用?
使用MVC模式設計應用,其中Model層完成脫離界面,即在Model層,其是可運行在任 何設備上,在controller層,根據iPhone與iPad(獨有UISplitViewController)的不一樣特色選擇不一樣的 viewController對象。在View層,可根據現實要求,來設計,其中以xib文件設計時,其設置其爲universal。
10. 在Objetive-C什麼是原子關鍵字?
atomic是Objc使用的一種線程保護技術,基本上來說,是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤。而這種機制是耗費系統資源的,因此在iPhone這種小型設備上,若是沒有使用多線程間的通信編程,那麼nonatomic是一個很是好的選擇。
11. UIView的動畫效果有那些?
UIViewAnimationOptionCurveEaseInOut,UIViewAnimationOptionCureveEaseIn,UIViewAnimationOptionTransitionFlipFromRight等等
12. 在iPhone應用中如何保存數據?
有三種方法:經過web保存在服務器上;經過NSCoder固化機制,將對象保存在文件中;經過SQlite或CoreData保存在文件數據庫中。
13. 什麼是coredata?
CoreData提供了一種簡便的對象持久化管理方法,使你能夠不用關心數據的存儲,只須要關心對象的增長、刪除、更改、讀寫。
14. 什麼是NSManagedObject模型?
託管對象模型是一個類,這個類包含每個你想存儲到數據存儲中的託管對象的定義。而一個託管對象表明你想要保存到數據存儲中的一個對象。這在概念上相似於SQL中的一條記錄, 而且一般也包含一些域,這些域對應於你想要保存的對象的屬性。用戶可經過子類化NSManagedObject,創建本身的數據模型。
15. 什麼是NSManagedobjectContext?
託管對象上下文相似於應用程序和數據存儲之間的一塊緩衝區。這塊緩衝區包含全部未被寫入數據存儲的託管對象。你能夠添加、刪除、更改緩衝區內的託管對象。在不少時候,當你須要讀、插入、刪除對象時,你將會調用託管對象上下文的方法。
NSManagedobjectContext對象負責應用和數據庫之間的交互。
16. 什麼是謂詞?
謂詞是經過NSPredicate建立,是經過給定的邏輯條件做爲約束條件,完成對數據的篩選。
17. coredata有哪幾種持久化存儲機制?
coredatat提供如下幾種存儲機制:XML(iOS系統不支持),自動存儲,SQLite,內存存儲。
1. 談談對Block 的理解?並寫出一個使用Block執行UIVew動畫?
Block是帶有自動變量的匿名函數。
1 [UIView transitionWithView:self.view 2 duration:0.2 3 options:UIViewAnimationOptionTransitionFlipFromLeft 4 animations:^ 5 { [[blueViewController view] removeFromSuperview]; 6 [[self view] insertSubview:yellowViewController.view atIndex:0]; } 7 completion:NULL];
2. 寫出上面代碼的Block的定義。
typedef void(^animations) (void);
typedef void(^completion) (BOOL finished);
3. 作過的項目是否涉及網絡訪問功能,使用什麼對象完成網絡功能?
ASIHTTPRequest與NSURLConnection。
4. 簡單介紹下NSURLConnection以及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的區別?
NSURLConnection主要用於網絡訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數據,即當前線程會阻塞,並等待request的返回的response。
而– initWithRequest:delegate:是異步加載,當其完成網絡訪問後,會經過delegate回到主線程,並其委託的對象。
1. 什麼是block?
2. block 實現原理。
3. block的使用。
4. 使用block和使用delegate完成委託模式有什麼優勢?
5. 多線程與block。
1. 多線程是什麼?
2. iOS 中的多線程。
3. 在項目何時選擇使用GCD,何時選擇NSOperation?
1. 你使用過Objective-C的運行時編程(Runtime Programming)麼?若是使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?
Objecitve-C的重要特性是Runtime(運行時),在#import <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用
```objective-c
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
```
代碼交換兩個方法,在寫unit test時使用到。
2. 你實現過多線程的Core Data麼?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些須要在線程中建立或者傳遞?你是用什麼樣的策略來實現的?
沒實現過多線程的CoreData(待實踐)
<!--more-->
3. Core開頭的系列的內容。是否使用過CoreAnimation和CoreGraphics。UI框架和CA,CG框架的聯繫是什麼?分別用CA和CG作過些什麼動畫或者圖像上的內容。(有須要的話還能夠涉及Quartz的一些內容)
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。
UIKit |
------------ |
Core Animation |
Core Graphics |
Graphics Hardware|
使用CA作過menu菜單的展開收起(太遜了)
4. 是否使用過CoreText或者CoreImage等?若是使用過,請談談你使用CoreText或者CoreImage的體驗。
CoreText能夠解決複雜文字內容排版問題。CoreImage能夠處理圖片,爲其添加各類效果。體驗是很強大,挺複雜的。
5. NSNotification和KVO的區別和用法是什麼?何時應該使用通知,何時應該使用KVO,它們的實現上有什麼區別嗎?若是用 protocol和delegate(或者delegate的Array)來實現相似的功能可能嗎?若是可能,會有什麼潛在的問題?若是不能,爲何? (雖然protocol和delegate這種東西面試已經面爛了…)
NSNotification是通知模式在iOS的實現,KVO的全稱是鍵值觀察(Key-value observing),其是基於KVC(key-value coding)的,KVC是一個經過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,可使用 NSNotification;若是是隻須要觀察某個對象的某個屬性,可使用KVO。
對於委託模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關係,而在通知模式中,每每是一對多的關係。委託模 式,從技術上能夠如今改變delegate指向的對象,但不建議這樣作,會讓人迷惑,若是一個delegate對象不斷改變,指向不一樣的對象。
6. 你用過NSOperationQueue麼?若是用過或者瞭解的話,你爲何要使用NSOperationQueue,實現了什麼?請描述它和GCD的區別和相似的地方(提示:能夠從二者的實現機制和適用範圍來描述)。
使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程併發數目。GCD和NSOperation均可以實現對線 程的管理,區別是 NSOperation和NSOperationQueue是多線程的面向對象抽象。項目中使用NSOperation的優勢是NSOperation是 對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是 多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
7. 既然提到GCD,那麼問一下在使用GCD以及block時要注意些什麼?它們兩是一回事兒麼?block在ARC中和傳統的MRC中的行爲和用法有沒有什麼區別,須要注意些什麼?如何避免循環引用?
使用block是要注意,若將block作函數參數時,須要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其餘函數內部變量的函數。更詳細的答案見個人這篇文章
8. 您是否作過異步的網絡處理和通信方面的工做?若是有,能具體介紹一些實現策略麼?
使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級,底層是用NSURLConnetion,詳細 可見開源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。
9. 對於Objective-C,你認爲它最大的優勢和最大的不足是什麼?對於不足之處,如今有沒有可用的方法繞過這些不足來實現需求。若是能夠的話,你有沒有考慮或者實踐太重新實現OC的一些功能,若是有,具體會如何作?
最大的優勢是它的運行時特性,不足是沒有命名空間,對於命名衝突,可使用長命名法或特殊前綴解決,若是是引入的第三方庫之間的命名衝突,可使用link命令及flag解決衝突。
10. 你實現過一個框架或者庫以供別人使用麼?若是有,請談一談構建框架或者庫時候的經驗;若是沒有,請設想和設計框架的public的API,並指出大概須要如何作、須要注意一些什麼方面,來使別人容易地使用你的框架。
抽象和封裝,方便使用。首先是對問題有充分的瞭解,好比構建一個文件解壓壓縮框架,從使用者的角度出發,只需關注發送給框架一個解壓請求,框架完成複雜文 件的解壓操做,而且在適當的時候通知給是哦難過者,如解壓完成、解壓出錯等。在框架內部去構建對象的關係,經過抽象讓其更爲健壯、便於更改。其次是API 的說明文檔。
1. 什麼是arc?(arc是爲了解決什麼問題誕生的?)
自動引用技術。
2. 請解釋如下keywords的區別: assign vs weak, __block vs __weak
weak至關於assign,不一樣的在於前者在對象被釋放後,變量會被賦值爲nil,防止野指針。
3. __block在arc和非arc下含義同樣嗎?
4. 使用atomic必定是線程安全的嗎?
5. 描述一個你遇到過的retain cycle例子。(別撒謊,你確定遇到過)
6. +(void)load; +(void)initialize;有什麼用處?
7. 爲何其餘語言裏叫函數調用, objective c裏則是給對象發消息(或者談下對runtime的理解)
8. 什麼是method swizzling?
9. UIView和CALayer是啥關係?
10. 如何高性能的給UIImageView加個圓角?(不許說layer.cornerRadius!)
11. 使用drawRect有什麼影響?(這個可深可淺,你至少得用過。。)
12. ASIHttpRequest或者SDWebImage裏面給UIImageView加載圖片的邏輯是什麼樣的?(把UIImageView放到UITableViewCell裏面問更贊)
13. 麻煩你設計個簡單的圖片內存緩存器(移除策略是必定要說的)
14. 講講你用Instrument優化動畫性能的經歷吧(別問我什麼是Instrument)
15. loadView是幹嗎用的?
16. viewWillLayoutSubView你老是知道的。。
17. GCD裏面有哪幾種Queue?你本身創建過串行queue嗎?背後的線程模型是什麼樣的?
18. 用過coredata或者sqlite嗎?讀寫是分線程的嗎?遇到過死鎖沒?咋解決的?
19. http的post和get啥區別?(區別挺多的,麻煩多說點)
20. 我知道你大學畢業事後就沒接觸過算法數據結構了,可是請你必定告訴我什麼是Binary search tree? search的時間複雜度是多少?我很想知道!
1. 在一個對象的方法裏面:self.name = 「object」;和name =」object」有什麼不一樣嗎?
self.name = 「object」會調用對象的setName()方法,
name = 「object」會直接把object賦值給當前對象的name 屬性。
而且 self.name 這樣retainCount會加1,而name就不會。
2. 定義屬性時,什麼狀況使用copy,assign,和retain。
assign用於簡單數據類型,如NSInteger,double,bool,retain 和copy用戶對象,copy用於當 a指向一個對象,b也想指向一樣的對象的時候,若是用assign,a若是釋放,再調用b會crash,若是用copy 的方式,a和b各自有本身的內存,就能夠解決這個問題。retain 會使計數器加一,也能夠解決assign的問題。另外:tomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果。
3. ViewController 的viewDidLoad,viewWillAppear,viewDidUnload,dealloc分別是在何時調用,在自定義ViewController的時候這幾個函數裏面應該作什麼工做?
4. 簡述objective-c內存管理的實現機制,並簡述何時由你負責釋放對象,何時不禁你釋放。
5. 類的定義及聲明文件以什麼爲後綴名?
6. 怎樣自動生成屬性的獲取方法和設置方法?
7. 聲明一個靜態方法和一個實例方法。
8. 寫一個發送同步http請求,並得到返回結果的方法。
9. 怎樣啓動一個新線程,子線程怎樣刷新主UI?
10. 什麼是MVC,你工做時怎樣運用它?
11. 你使用過json解析方式麼,他們的底層是如何處理的你瞭解麼?
json解析的用法,用框架的用法簡單介紹:底層原理遍歷字符串中的字符,最終根據格式規定的特殊字符,好比{}號,[]號, : 號 等進行區分,{}號是一個字典的開始,[]號是一個數組的開始, : 號是字典的鍵和值的分水嶺,最終乃是將json數據轉化爲字典,字典中值多是字典,數組,或字符串而已。
37.xml解析的原理是什麼,你還用過其餘解析方式麼?
NSXMLParser, 其餘解析方式有自定義二進制解析,就是按字節去解析,電話會談就是如此,還能夠是字符串之間用特殊符號鏈接的數據,將此數據用特殊符號能夠分割成所用數據。
38.協議是什麼,有什麼做用?
協議很像java中的接口,某個類實現協議後,就必須實現協議中規定的@require的方法,好比一個類A, 一個類B都實現某「協議」後,這個類A的對象和B的對象均可以賦值給這個協議的類型變量,好比 id<協議> 變量名 = A類或B類的對象,因而這個變量就完成了可以指向多個不一樣的類的對象並調用對象中的實現協議的方法。
39. 分線程回調主線程方法是什麼,有什麼做用?
[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil waitUntilDone:YES];