iOS面試題總結,ios試題總結

來源:互聯網
上載者:User

iOS面試題總結,ios試題總結
1.為什麼說Objective-C是一門動態語言?

1.object-c類的類型和資料變數的類型都是在運行是確定的,而不是在編譯時間確定。例如:多態特性,我們可以使用父類對象來指向子類對象,並且可以用來調用子類的方法。運行時(runtime)特性,我們可以動態添加方法,或者替換方法。

2.講一下MVC和MVVM,MVP?

MVC:簡單來說就是,邏輯、試圖、資料進行分層,實現解耦。
MVVM:是Model-View-ViewMode模式的簡稱。由視圖(View)、視圖模型(ViewModel)、模型(Model)三部分組成.比MVC更加釋放控制器臃腫,將一部分邏輯(耗時,公用方法,網路請求等)和資料的處理等操作從控制器裡面搬運到ViewModel
MVVM的特點:

  1. 可重用性。可以把一些視圖的邏輯放在ViewModel裡面,讓很多View重用這段視圖邏輯。
 
  1. 獨立開發。開發人員可以專註與商務邏輯和資料的開發(ViewModel)。設計人員可以專註於介面(View)的設計。
  1. 可測試性。可以針對ViewModel來對介面(View)進行測試

MVP:本小編沒有接觸,希望可以得到大家的協助。可以在下面留言。

3.為什麼代理要用weak?代理的delegate和dataSource有什麼區別?block和代理的區別?

代理是使用weak來修飾的。1.使用weak是為了避免循環參考。2.當使用weak修飾的屬性,當對象釋放的時候,系統會對屬性賦值nil,object-c有個特性就是對nil對象發送訊息也就是調用方法,不會cash。
delegate:表示代理,代理可以讓A對象通知B對象,我(A)發生的變化,前提B遵循了A的代理,並且實現了A的代理方法。
dataSource:表示資料來源,如果A對象聲明了資料來源,當我們建立A對象的時候,我們就該實現資料來源,來告訴A,他所需要的一些資料。例如:tableView資料來源方法,需要告訴它,我要實現幾組cell,每組cell多少行cell,實現的cell什麼樣式,什麼內容
同樣delegatedataSource,都是可以使用requireoptional來修飾的。

代理和Block的區別

相同點:代理和Block大多是我們都可以用來做倒序傳值的。我們都得注意避免循環參考。
不同點:代理使用weak修飾,代理必須先聲明方法。當我們調用代理的時候要判斷是否已經實現。
block:使用的是copy來修飾,block儲存的是一段代碼,其實也就是一個函數。當我們調用block的時候要判斷是否已經實現。

4.屬性的實質是什嗎?包括哪幾個部分?屬性預設的關鍵字都有哪些?@dynamic關鍵字和@synthesize關鍵字是用來做什麼的?

屬性是描述類的特徵,也就是具備什麼特性。三個部分,帶底線的成員變數,get、setter方法。
預設關鍵字:readwrite,assign, atomic;
@dynamic :修飾的屬性,其getter和setter方法編譯器是不會自動幫你產生。必須自己是實現的。
@synthesize:修飾的屬性,其getter和setter方法編譯器是會自動幫你產生。不必自己實現,可以指定與屬性相對應的成員變數。

5.屬性的預設關鍵字是什嗎?

預設關鍵字:readwrite,assign, atomic;

6.NSString為什麼要用copy關鍵字,如果用strong會有什麼問題?(注意:這裡沒有說用strong就一定不行。使用copy和strong是看情況而定的

眾所周知,我們知道,可變類型(NSMutableArray,NSMutableString等)是不可邊類型(NSString,NSArray等)的子類,因為多態的原因,我們可以使用賦值指向子類對象,也就是我們可以使用不可邊類型去接受可變類型。
1.當我們使用strong修飾A不可邊類型的時候,並且使用B可變類型給A賦值,再去修改可變類型B值的時候,A所指向的值也會發生改變。引文strong只是讓建立的對象引用計數器+1,並返回當前對象的內容地址,當我們修改B指向的內容的時候,A指向的內容也同樣發生了改變,因為他們指向的記憶體位址是相同的,是一份內容。
2.當我們使用copy修飾A不可邊類型的時候,並且使用B可變類型給A賦值,再去修改可變類型B值的時候,A所指向的值不會發生改變。因為當時用copy的修飾的時候,會拷貝一份內容出來,並且返回指標給A,當我們修改B指向的內容的時候,A指向的內容是沒有發生改變的。因為A指向的記憶體位址和B指向的記憶體位址是不相同的,是兩份內容
3.copy修飾不可邊類型(NSString,NSArray等)的時候,且使用不可邊類型進行賦值,表示淺拷貝,只拷貝一份指標,和strong修飾一樣,當修飾的是可變類型(NSMutableArray,NSMutableString等)的時候,表示深拷貝,直接拷貝新一份內容,到記憶體中。表示兩份內容。

7.如何令自己所寫的對象具有拷貝功能?

必須遵循nscopying協議,如果想實現可變和不可邊拷貝時,必須同時遵循nscopingnsmutablecoping協議。並且實現
- (id)copyWithZone:(NSZone *)zone;

8.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什麼區別?如果是集合是內容複寫的話,集合裡面的元素也是內容複寫嗎?

可變使用copy表示深拷貝,不可變集合類使用copy的時候是淺拷貝。
可變集合類使用mutablecopy表示深拷貝,不可變集合類使用copy的時候是淺拷貝。
關於容器實現copy 或 metableCopy ,容器內元素預設都是 指標拷貝,不是內容複寫。

9.為什麼IBOutlet修飾的UIView也適用weak關鍵字?

在xib或者Sb拖控制項時,其實控制項就載入到了父控制項的subviews數組裡面,進行了強引用,即使使用了weak,也不造成對象的釋放。

10.nonatomic和atomic的區別?atomic是絕對的安全執行緒嗎?為什嗎?如果不是,那應該如何??

nonatomic:表示非原子,不安全,但是效率高。
atomic:表示原子行,安全,但是效率定。
atomic:不能絕對保證線程的安全,當多線程同時訪問的時候,會造成線程不安全。可以使用線程鎖來保證線程的安全。

11.UICollectionView自訂layout如何??

實現一個自訂layout的常規做法是繼承UICollectionViewLayout類,然後重載下列方法:

-(CGSize)collectionViewContentSize返回collectionView的內容的尺寸-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect返回rect中的所有的元素的布局屬性返回的是包含UICollectionViewLayoutAttributes的NSArrayUICollectionViewLayoutAttributes可以是cell,追加視圖或裝飾視    圖的資訊,通過不同的UICollectionViewLayoutAttributes初始化方法可以得到不同類型的UICollectionViewLayoutAttributes:   layoutAttributesForCellWithIndexPath:   layoutAttributesForSupplementaryViewOfKind:withIndexPath:layoutAttributesForDecorationViewOfKind:withIndexPath:  -(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath返回對應於indexPath的位置的cell的布局屬性-(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath返回對應於indexPath的位置的追加視圖的布局屬性,如果沒有追加視圖可不重載-(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath返回對應於indexPath的位置的裝飾視圖的布局屬性,如果沒有裝飾視圖可不重載-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds當邊界發生改變時,是否應該重新整理布局。如果YES則在邊界變化(一般是scroll到其他地方)時,將重新計算需要的布局資訊。
12.用StoryBoard開發介面有什麼弊端?如何避免?

使用簡單邏輯頁面的跳轉是可以使用sb的,開發比較塊。
但是SB對於邏輯項目比較複雜的時候,開發起來比較慢。不適合多人合作開發;也不利於版本的梗系和後期的維護。使用sb在項目變異編譯的時候,也都會直接載入到記憶體中,造成記憶體的浪費。
可以使用xib來代替,編輯複雜邏輯介面時候可以使用純碼編寫。

13.進程和線程的區別?同步非同步區別?並行和並發的區別?

進程:是具有一定獨立功能的程式關於某個資料集合上的一次運行活動,進程是系統進行資源分派和調度的一個獨立單位.
線程:是進程的一個實體,是CPU調度和指派的基本單位,它是比進程更小的能獨立啟動並執行基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共用進程所擁有的全部資源.
同步:阻塞當前線程操作,不能開闢線程。
非同步:不阻礙線程繼續操作,可以開闢線程來執行任務。
並發:當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU已耗用時間劃分成若干個時間段,再將時間 段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式我們稱之為並發(Concurrent)。
並行:當系統有一個以上CPU時,則線程的操作有可能非並發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。
區別:並發和並行是即相似又有區別的兩個概念,並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔內發生。在多道程式環境下,並發性是指在一段時間內宏觀上有多個程式在同時運行,但在單處理機系統中,每一時刻卻僅能有一道程式執行,故微觀上這些程式只能是分時地交替執行。倘若在電腦系統中有多個處理機,則這些可以並發執行的程式便可被分配到多個處理機上,實現並存執行,即利用每個處理機來處理一個可並發執行的程式,這樣,多個程式便可以同時執行。

14.線程間通訊?

當使用dispath-async函數開闢線程執行任務的完成時,我們需要使用dispatch_async(dispatch_get_main_queue(), ^{ });函數會到主線程內重新整理UI。並完成通訊

15.GCD的一些常用的函數?(group,barrier,訊號量,線程同步)

我們使用隊列組來開闢線程時,隊列組中的隊列任務是並發,當所有的隊列組中的所有任務完成時候,才可以調用隊列組完成任務。

/**建立自己的隊列*/dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);/**建立一個隊列組*/dispatch_group_t dispatchGroup = dispatch_group_create();/**將隊列任務添加到隊列組中*/dispatch_group_async(dispatchGroup, dispatchQueue, ^(){    NSLog(@"dispatch-1");});   /**將隊列任務添加到隊列組中*/dispatch_group_async(dispatchGroup, dispatchQueue, ^(){    NSLog(@"dspatch-2");});  /**隊列組完成調用函數*/dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){    NSLog(@"end");})

barrier:表示柵欄,當在並發隊列裡面使用柵欄時候,柵欄之前的並發任務開始並發執行,執行完畢後,執行柵欄內的任務,等柵欄任務執行完畢後,再並發執行柵欄後的任務。

dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);dispatch_async(concurrentQueue, ^(){    NSLog(@"dispatch-1");});dispatch_async(concurrentQueue, ^(){    NSLog(@"dispatch-2");});dispatch_barrier_async(concurrentQueue, ^(){    NSLog(@"dispatch-barrier"); });dispatch_async(concurrentQueue, ^(){    NSLog(@"dispatch-3");});dispatch_async(concurrentQueue, ^(){    NSLog(@"dispatch-4");});

訊號量:Semaphore是通過‘計數’的方式來標識線程是否是等待或繼續執行的。訊號量

dispatch_semaphore_create(int) // 建立一個訊號,並初始化訊號的計數大小/* 等待訊號,並且判斷訊號量,如果訊號量計數大於等於你建立時候的訊號量的計數,就可以通過,繼續執行,並且將你傳入的訊號計數減1, * 如果傳入的訊號計數小於你建立的計數,就表示等待,等待訊號計數的變化 *  如果等待的時間超過你傳入的時間,也會繼續下面操作 *   第一個參數:semaphore 表示訊號量 *   第二個參數:表示等待的時間 *    返回int 如果傳入的訊號計數大於等於你建立訊號的計數時候,返回0.  反之,返回的不等於0 */ int result = dispatch_semaphore_wait(dispatch_semaphore_t  semaphore,time outTime);// 表示等待,也是阻礙線程// 表示將訊號技術+1dispatch_semaphore_signl(dispatch_semaphore_t semaphore);

實現線程的同步的方法:串列隊列,分組,訊號量。也是可以使用並發隊列。

   //排入佇列dispatch_async(concurrentQueue, ^{    //1.先去網上下載圖片    dispatch_sync(concurrentQueue, ^{           });    //2.在主線程展示到介面裡    dispatch_sync(dispatch_get_main_queue(), ^{    });});
16.如何使用隊列來避免資源搶奪?

當我們使用多線程來訪問同一個資料的時候,就有可能造成資料的不準確性。這個時候我麼可以使用線程鎖的來來綁定。也是可以使用串列隊列來完成。如:fmdb就是使用FMDatabaseQueue,來解決多線程搶奪資源。

17.資料持久化的幾個方案(fmdb用沒用過)

持久化方案:
plist,儲存字典,數組比較好用
preference:喜好設定,實質也是plist
NSKeyedArchiver:歸檔,可以儲存物件
sqlite:資料庫,經常使用第三方來操作,也就是fmdb
coreData:也是資料庫儲存,蘋果官方的

18.說一下appdelegate的幾個方法?從後台到前台調用了哪些方法?第一次啟動調用了哪些方法?從前台到後台調用了哪些方法?
1029210 (1).gif19.NSCache優於NSDictionary的幾點?

1.nscache 是可以自動釋放記憶體的。
2.nscache是安全執行緒的,我們可以在不同的線程中添加,刪除和查詢快取中的對象。
3.一個緩衝對象不會拷貝key對象。

20.知不知道Designated Initializer?使用它的時候有什麼需要注意的問題?

個人理解:初始化函數,如果你想自訂初始化函數時,也是必須要初始化父類,以來保證可以繼承父類的一些方法或者屬性。
Designated Initializer

21.實現description方法能取到什麼效果?

description是nsobject的一個執行個體的方法,返回的是一個nsstring。當我們使用nslog列印的時候,列印出來的一般都是對象的記憶體位址,如果我們實現description方法時,我們就可以使用nslog列印對象的時候,我們可以把它裡面的屬性值和記憶體位址一起列印出來.列印什麼,就是看你寫什麼了。

-(NSString *)description{        NSString * string = [NSString stringWithFormat:@"<Person:記憶體位址:%p name = %@ age = %ld>",self,self.name,self.age];        return string;      }  
22.objc使用什麼機制管理對象記憶體?

使用記憶體管理計數器,來管理記憶體的。當記憶體管理計數器為0的時候,對象就會被釋放。

中級Block1.block的實質是什嗎?一共有幾種block?都是什麼情況下產生的?

block:本質就是一個object-c對象.
block:儲存位置,可能分為3個地方:代碼去,堆區、棧區(ARC情況下會自動拷貝到堆區,因此ARC下只能有兩個地方:代碼去、堆區)
代碼區:不訪問棧區的變數(如局部變數),且不訪問堆區的變數(alloc建立的對象),此時block存放在代碼去。
堆區:訪問了處於棧區的變數,或者堆區的變數,此時block存放在堆區。–需要注意實際是放在棧區,在ARC情況下會自動拷貝到堆區,如果不是ARC則存放在棧區,所在函數執行完畢就回釋放,想再外面調用需要用copy指向它,這樣就拷貝到了堆區,strong屬性不會拷貝、會造成野指標錯區。

2.為什麼在預設情況下無法修改被block捕獲的變數? __block都做了什嗎?

預設情況下,block裡面的變數,拷貝進去的是變數的值,而不是指向變數的記憶體的指標。
當使用__block修飾後的變數,拷貝到block裡面的就是指向變數的指標,所以我們就可以修改變數的值。

3.類比一下循環參考的一個情況?block實現介面反向傳值如何??
 Person *p = [[Person alloc]init];[p setPersonBlock:^(NSString *str) {    p.name = str;}];
Runtime1.objc在向一個對象發送訊息時,發生了什嗎?

根據對象的isa指標找到類對象id,在查詢類對象裡面的methodLists方法函數列表,如果沒有在好到,在沿著superClass,尋找父類,再在父類methodLists方法列表裡面查詢,最終找到SEL,根據idSEL確認IMP(指標函數),在發送訊息;

3.什麼時候會報unrecognized selector錯誤?iOS有哪些機制來避免走到這一步?

當發送訊息的時候,我們會根據類裡面的methodLists列表去查詢我們要動用的SEL,當查詢不到的時候,我們會一直沿著父類查詢,當最終查詢不到的時候我們會報unrecognized selector錯誤
當系統查詢不到方法的時候,會調用+(BOOL)resolveInstanceMethod:(SEL)sel動態解釋的方法來給我一次機會來添加,調用不到的方法。或者我們可以再次使用-(id)forwardingTargetForSelector:(SEL)aSelector重新導向的方法來告訴系統,該調用什麼方法,一來保證不會崩潰。

4.能否向編譯後得到的類中增加執行個體變數?能否向運行時建立的類中添加執行個體變數?為什嗎?

1.不能向編譯後得到的類增加執行個體變數
2.能向運行時建立的類中添加執行個體變數
解釋:
1.編譯後的類已經註冊在runtime中,類結構體中的objc_ivar_list執行個體變數的鏈表和instance_size執行個體變數的記憶體大小已經確定,runtime會調用class_setvarlayout或class_setWeaklvarLayout來處理strong weak引用.所以不能向存在的類中添加執行個體變數
2.運行時建立的類是可以添加執行個體變數,調用class_addIvar函數.但是的在調用objc_allocateClassPair之後,objc_registerClassPair之前,原因同上.

5.runtime如何?weak變數的自動置nil?

runtime 對註冊的類, 會進行布局,對於 weak 對象會放入一個 hash 表中。 用 weak 指向的對象記憶體位址作為 key,當此對象的引用計數為0的時候會 dealloc,假如 weak 指向的對象記憶體位址是a,那麼就會以a為鍵, 在這個 weak 表中搜尋,找到所有以a為鍵的 weak 對象,從而設定為 nil。

6.給類添加一個屬性後,在類結構體裡哪些元素會發生變化?

instance_size :執行個體的記憶體大小
objc_ivar_list *ivars:屬性列表

RunLoop1.runloop是來做什麼的?runloop和線程有什麼關係?主線程預設開啟了runloop嗎?子線程呢?

runloop:字面意思就是跑圈,其實也就是一個迴圈跑圈,用來處理線程裡面的事件和訊息。
runloop和線程的關係:每個線程如果想繼續運行,不被釋放,就必須有一個runloop來不停的跑圈,以來處理線程裡面的各個事件和訊息。
主線程預設是開啟一個runloop。也就是這個runloop才能保證我們程式正常的運行。子線程是預設沒有開始runloop的

2.runloop的mode是用來做什麼的?有幾種mode?

model:是runloop裡面的模式,不同的模式下的runloop處理的事件和訊息有一定的差別。
系統預設註冊了5個Mode:
(1)kCFRunLoopDefaultMode: App的預設 Mode,通常主線程是在這個 Mode 下啟動並執行。
(2)UITrackingRunLoopMode: 介面跟蹤 Mode,用於 ScrollView 追蹤觸摸滑動,保證介面滑動時不受其他 Mode 影響。
(3)UIInitializationRunLoopMode: 在剛啟動 App 時第進入的第一個 Mode,啟動完成後就不再使用。
(4)GSEventReceiveRunLoopMode: 接受系統事件的內部 Mode,通常用不到。
(5)kCFRunLoopCommonModes: 這是一個佔位的 Mode,沒有實際作用。
注意iOS 對以上5中model進行了封裝
NSDefaultRunLoopMode;
NSRunLoopCommonModes

3.為什麼把NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運行迴圈以後,滑動scrollview的時候NSTimer卻不動了?

nstime對象是在 NSDefaultRunLoopMode下面調用訊息的,但是當我們滑動scrollview的時候,NSDefaultRunLoopMode模式就自動切換到UITrackingRunLoopMode模式下面,卻不可以繼續響應nstime發送的訊息。所以如果想在滑動scrollview的情況下面還調用nstime的訊息,我們可以把nsrunloop的模式更改為NSRunLoopCommonModes

4.蘋果是如何?Autorelease Pool的?

Autorelease Pool作用:緩衝池,可以避免我們經常寫relase的一種方式。其實就是延遲release,將建立的對象,添加到最近的autoreleasePool中,等到autoreleasePool範圍結束的時候,會將裡面所有的對象的引用計數器-1.
autorelease

類結構1.isa指標?(對象的isa,類對象的isa,元類的isa都要說)

在oc中,類也是對象,所屬元類。所以經常說:萬物皆對象

對象的isa指標指向所屬的類
類的isa指標指向了所屬的元類
元類的isa指向了根元類,根元類指向了自己。


AC17D0A0-CB2A-4C23-8430-4BC7A99571CE.png2.類方法和執行個體方法有什麼區別?

調用的方式不同,類方法必須使用類調用,在方法裡面不能調用屬性,類方法裡面也必須調用類方法。儲存在元類結構體裡面的methodLists裡面
執行個體方法必須使用執行個體對象調用,可以在執行個體方法裡面使用屬性,執行個體方法也必須調用執行個體方法。儲存在類結構體裡面的methodLists裡面

3.介紹一下分類,能用分類做什嗎?內部是如何?的?它為什麼會覆蓋掉原來的方法?

category:我們可以給類或者系統類別添加執行個體方法方法。我們添加的執行個體方法,會被動態添加到類結構裡面的methodList列表裡面。categort

4.運行時能增加成員變數嗎?能增加屬性嗎?如果能,如何增加?如果不能,為什嗎?

可以添加屬性的,但必須我們實現它的gettersetter方法。但是沒有添加帶下滑線同名的成員變數
但是我們使用runtime我們就可以實現新增成員變數方法如下

- (void)setName:(NSString *)name {/** *  為某個類關聯某個對象 * *  @param object#> 要關聯的對象 description#> *  @param key#>    要關聯的屬性key description#> *  @param value#>  你要關聯的屬性 description#> *  @param policy#> 添加的成員變數的修飾符 description#> */  objc_setAssociatedObject(self, @selector(name), name,   OBJC_ASSOCIATION_COPY_NONATOMIC);}- (NSString *)name {/** *  擷取到某個類的某個關聯對象 * *  @param object#> 關聯的對象 description#> *  @param key#>    屬性的key值 description#> */return objc_getAssociatedObject(self, @selector(name));}
5.objc中向一個nil對象發送訊息將會發生什嗎?(傳回值是對象,是標量,結構體)

• 如果一個方法傳回值是一個對象,那麼發送給nil的訊息將返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother]; 如果spouse對象為nil,那麼發送給nil的訊息mother也將返回nil。
• 如果方法傳回值為指標類型,其指標大小為小於或者等於sizeof(void*),float,double,long double 或者long long的整型標量,發送給nil的訊息將返回0。
• 如果方法傳回值為結構體,正如在《Mac OS X ABI 函數調用指南》,發送給nil的訊息將返回0。結構體中各個欄位的值將都是0。其他的結構體資料類型將不是用0填充的。
• 如果方法的傳回值不是上述提到的幾種情況,那麼發送給nil的訊息的傳回值將是未定義的。

詳細解答

進階1.UITableview的最佳化方法(緩衝高度,非同步繪製,減少層級,hide,避免離屏渲染)

緩衝高度:當我們建立frame模型的時候,計算出來cell的高度的時候,我們可以將cell的高度緩衝到字典裡面,以cell的indexpathIdentifier作為為key。

NSString *key = [[HeightCache shareHeightCache] makeKeyWithIdentifier:@"YwywProductGradeCell" indexPath:indexPath];if ([[HeightCache shareHeightCache] existInCacheByKey:key]) {    return [[HeightCache shareHeightCache] heightFromCacheWithKey:key];}else{    YwywProductGradeModelFrame *modelFrame = self.gradeArray[indexPath.row];    [[HeightCache shareHeightCache] cacheHieght:modelFrame.cellHight key:key];    return modelFrame.cellHight;}

非同步繪製、減少層級:目前還不是很清楚
hide:個人理解應該是hidden吧,把可能會用到的控制項都建立出來,根據不同的情況去隱藏或者顯示出來。
避免離屏渲染:只要不是同時使用邊框/邊框顏色以及圓角的時候,都可以使用layer直接設定。不會造成離屏渲染。

2.有沒有用過運行時,用它都能做什嗎?(交換方法,建立類,給新建立的類增加方法,改變isa指標)

交換方式:一般寫在類的+(void)load方法裡面

   /** 擷取原始setBackgroundColor方法 */Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));/** 擷取自訂的pb_setBackgroundColor方法 */Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));/** 交換方法 */method_exchangeImplementations(originalM, exchangeM);
建立類:
Class MyClass = objc_allocateClassPair([NSObject class], "Person", 0);
添加方法
/**參數一、類名參數   二、SEL 添加的方法名字參數    三、IMP指標 (IMP就是Implementation的縮寫,它是指向一個方法實現的指標,每一個方法都有一個對應的IMP)  參數四、其中types參數為"i@:@“,按順序分別表示:具體類型可參照[官方文檔](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)i 傳回值類型int,若是v則表示void@ 參數id(self): SEL(_cmd)@ id(str)  V@:表示傳回值是void 帶有SEL參數 (An object (whether statically typed or typed id))  */class_addMethod(Person, @selector(addMethodForMyClass:), (IMP)addMethodForMyClass, "V@:");
添加執行個體變數
/**參數一、類名參數  二、屬性名稱參數  三、開闢位元組長度參數  四、對其方式參數  五、參數類型 “@” 官方解釋 An object (whether statically typed or typed id) (對象 靜態類型或者id類型) 具體類型可參照[官方文檔](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)return: BOOL 是否添加成功  */BOOL isSuccess = class_addIvar(Person, "name", sizeof(NSString *), 0, "@");isSuccess?NSLog(@"添加變數成功"):NSLog(@"添加變數失敗");
3.看過哪些第三方架構的源碼?都是如何?的?(如果沒有,問一下多圖下載的設計)4.SDWebImage的緩衝策略?

sd載入一張圖片的時候,會先在記憶體裡面尋找是否有這張圖片,如果沒有會根據圖片的md5(url)後的名稱去沙箱裡面去尋找,是否有這張圖片,如果沒有會開闢線程去下載,下載完畢後載入到imageview上面,並md(url)為名稱緩衝到沙箱裡面。

5.AFN為什麼添加一條常駐線程?

AFN 目的:就是開闢線程請求網路資料。如果沒有常住線程的話,就會每次請求網路就去開闢線程,完成之後銷毀開闢線程,這樣就造成資源的浪費,開闢一條常住線程,就可以避免這種浪費,我們可以在每次的網路請求都添加到這條線程。

6.KVO的使用?實現原理?(為什麼要建立子類來實現)

kvo:索引值觀察,根據鍵對應的值的變化,來調用方法。
註冊觀察者:addObserver:forKeyPath:options:context:
實現觀察者:observeValueForKeyPath:ofObject:change:context:
移除觀察者:removeObserver:forKeyPath:(對象銷毀,必須移除觀察者)
注意
使用kvo監聽A對象的時候,監聽的本質不是這個A對象,而是系統建立的一個中間對象NSKVONotifying_A並繼承A對象,並且A對象的isa指標指向的也不是A的類,而是這個NSKVONotifying_A對象
kvo詳解
kvo詳解2

7.KVC的使用?實現原理?(KVC拿到key以後,是如何賦值的?知不知道集合操作符,能不能訪問私人屬性,能不能直接存取_ivar)

kvc:索引值賦值,使用最多的即使字典轉模型。利用runtime擷取對象的所有成員變數, 在根據kvc索引值賦值,進行字典轉模型
setValue: forKey: 只尋找本類裡面的屬性
setValue: forKeyPath:會尋找本類裡面屬性,沒有會繼續尋找父類裡面屬性。
kvc詳解

項目1.有已經上線的項目嗎?2.項目裡哪個部分是你完成的?(找一個亮點問一下如何?的)3.開發過程中遇到過什麼困難,是如何解決的?學習4.遇到一個問題完全不能理解的時候,是如何協助自己理解的?舉個例子?5.有看書的習慣嗎?最近看的一本是什麼書?有什麼心得?6.有沒有使用一些筆記軟體?會在多平台同步以及多渠道採集嗎?(如果沒有,問一下是如何複習知識的)7.有沒有使用清單類,日曆類的軟體?(如果沒有,問一下是如何安排,計劃任務的)8.平常看部落格嗎?有沒有自己寫過?(如果寫,有哪些收穫?如果沒有寫,問一下不寫的原因)

以上就是全部的面試題,後面的面試題,就該根據個人的情況來回答了。
以上的面試回答,有的是根據自己的知識儲備回答,有的也是小編百度的。
以上的回答也不知道對與錯,歡迎大家發表自己的看法



作者:七秒記憶的魚兒
連結:http://www.jianshu.com/p/f9eb6b315c08
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.