iOS面試題

基礎篇

Objective-C的類能夠多重繼承麼?能夠採用多個協議麼?

不能夠多重繼承,能夠採用多個協議.android

objc使用什麼機制管理對象內存?

  1. MRC 手動引用計數
  2. ARC 自動引用計數,如今一般使用自動引用計數

import 跟#include 又什麼區別,@class呢, #import<> 跟 #import」」又什麼區別?

import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重複導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,能夠解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import」」用來包含用戶頭文件。程序員

描述一下iOS SDK中如何實現MVC的開發模式

MVC是模型、試圖、控制開發模式,對於iOS SDK,全部的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。全部的用戶數據都是模型層,它應該獨立於視圖。全部的ViewController都是控制層,由它負責控制視圖,訪問模型數據。設計模式

淺複製和深複製的區別?

  1. 淺層複製:只複製指向對象的指針,而不復制引用對象自己。
  2. 深層複製:複製引用對象自己。

意思就是說我有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源
仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了
兩份獨立對象自己。api

category是什麼? 擴展一個類的方式用繼承好仍是類目好? 爲何?

category是類目.用類目好,由於繼承要知足A is a B的關係,而類目只須要知足A has a B的關係,侷限性更小,你不用定義子類就能擴展一個類的功能,還能將類的定義分開放在不一樣的源文件裏,用category去重寫類的方法,僅對本category有效,不會影響到其餘類與原有類的關係。安全

延展是什麼? 做用是什麼?

延展(extension):在本身類的實現文件中添加類目來聲明私有方法。服務器

解釋一下懶漢模式?

懶漢模式,只在用到的時候纔去初始化。
也能夠理解成延時加載。
我以爲最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
一個延時載,避免內存太高,一個異步加載,避免線程堵塞。網絡

進階篇

@property中有哪些屬性關鍵字?

屬性能夠擁有的特質分爲四類:異步

  1. 原子性—- nonatomic 特質

在默認狀況下,由編譯器合成的方法會經過鎖定機制確保其原子性(atomicity)。若是屬性具有 nonatomic 特質,則不使用同步鎖。請注意,儘管沒有名爲「atomic」的特質(若是某屬性不具有 nonatomic 特質,那它就是「原子的」 ( atomic) ),可是仍然能夠在屬性特質中寫明這一點,編譯器不會報錯。如果本身定義存取方法,那麼就應該聽從與屬性特質相符的原子性。socket

  1. 讀/寫權限—-readwrite(讀寫)、readonly (只讀)async

  2. 內存管理語義—-assign、strong、 weak、copy
    方法名—-getter= 、setter=

你常用一些第三方庫有哪些?

  1. AFNetworking
  2. SDWebImage
  3. FMDB
  4. JSONKit
  5. MJRefresh
  6. MJExtension
  7. Masonry
  8. 友盟,shareSDK等三方庫。

你常常用的設計模式有哪些?

  1. MVC
  2. 代理模式
  3. 觀察者模式
  4. 單例模式
  5. 工廠模式

本地存儲有哪些方式?

  1. 屬性列表(NSUserDefault 或 plist)
  2. 對象歸檔 (NSKeyedArchiver)
  3. SQLite
  4. CoreData

weak屬性須要在dealloc中置nil麼?

不須要,在ARC環境不管是強指針仍是弱指針都無需在deallco設置爲nil,ARC會自動幫咱們處理。

@synthesize和@dynamic分別有什麼做用?

  1. @property有兩個對應的詞,一個是@synthesize,一個是@dynamic。若是@synthesize和@dynamic都沒寫,那麼默認的就是@syntheszie var = _var;
  2. @synthesize的語義是若是你沒有手動實現setter方法和getter方法,那麼編譯器會自動爲你加上這兩個方法。
  3. @dynamic告訴編譯器,屬性的setter與getter方法由用戶本身實現,不自動生成。

用@property聲明的NSString(或NSArray,NSDictionary)常用copy關鍵字,爲何?若是改用strong關鍵字,可能形成什麼問題?

  1. 由於父類指針能夠指向子類對象,使用copy的目的是爲了讓本對象的屬性不受外界影響,使用copy不管給我傳入是一個可變對象仍是不可對象,我自己持有的就是一個不可變的副本.
  2. 若是咱們使用是strong,那麼這個屬性就有可能指向一個可變對象,若是這個可變對象在外部被修改了,那麼會影響該屬性.

何時會報unrecognized selector的異常?

當該對象上某個方法,而該對象上沒有實現這個方法的時候

使用block時什麼狀況會發生引用循環,如何解決?

  1. 只要是一個對象對該block進行了強引用,在block內部有直接使用到該對象。
  2. 解決方案:__weak id weakSelf = self; 

使用系統的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環問題?

通常不用考慮,由於官方文檔中沒有告訴咱們要注意發生強引用,因此推測系統控件通常沒有對這些block進行強引用,因此咱們能夠不用考慮循環強引用的問題

GCD的隊列(dispatch_queue_t)分哪兩種類型?

串行隊列和並行隊列

如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片,而後在都下載完成後合成一張整圖)

整體上說: 使用 dispatch group,而後 wait forever 等待完成, 或者採起 group notify 來通知回調。

1
2
3
4
5
6
7
8
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加載圖片1 */ });
dispatch_group_async(group, queue, ^{ /*加載圖片2 */ });
dispatch_group_async(group, queue, ^{ /*加載圖片3 */ });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合併圖片
})

如下代碼運行結果如何?

只能輸出1,而後線程主線程死鎖

1
2
3
4
5
6
7
8
9
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}

若一個類有實例變量NSString *_foo,調用setValue:forKey:時,能夠以foo仍是_foo做爲key?

均可以

IBOutlet連出來的視圖屬性爲何能夠被設置成weak?

由於視圖已經對它有一個強引用了

你單例怎麼理解怎麼用的?

Singleton Pattern單例設計模式,經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。類只能有一個實例,並且必須從一個爲人熟知的訪問點對其進行訪問,好比工廠方法。這個惟一的實例只能經過子類化進行擴展,並且擴展的對象不會破壞客戶端代碼。例如,UIApplication的sharedApplication方法,任什麼時候候都會返回一個當前應用程序的UIApplication實例。

lldb(gdb)經常使用的調試命令?

最經常使用就是 : po 對象

什麼是謂詞?

謂詞是經過NSPredicate,是經過給定的邏輯條件做爲約束條件,完成對數據的篩選。

+(void)load; +(void)initialize; 的區別?

+(void)load; 在程序運行後當即執行。
+(void)initialize; 在類的方法第一次被調時執行.

什麼是KVC,什麼是KVO?

  1. kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。
  2. kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。

何時用delegate,何時用Notification?

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

block和weak區別?

  1. __block無論是ARC仍是MRC模式下均可以使用,能夠修飾對象,還能夠修飾基本數據類型。 
  2. __weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。 
  3. block對象能夠在block中被從新賦值,weak不能夠。

frame和bounds有什麼不一樣?

frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)bounds指的是:該view在自己座標系統中 的位置和大小。(參照點是自己座標系統)

UIView和CALayer有什麼不一樣?

二者最大的區別是,圖層不會直接渲染到屏幕上,UIView是iOS系統中界面元素的基礎,全部的界面元素都是繼承自它。它自己徹底是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView自己更像是一個CALayer的管理器。一個UIView上能夠有n個CALayer,每一個layer顯示一種東西,加強UIView的展示能力。

TCP和UDP的區別?

  1. TCP:(傳輸控制協議),提供面向鏈接的、可靠地點對點的通訊;
  2. UDP:(用戶數據報協議),提供非鏈接的不可靠的點對多點的通訊;
  3. 實際運用中,看程序注重的是哪一方面,是可靠仍是快速;

socket鏈接與http鏈接

  1. http鏈接:短鏈接。即客戶端向服務端發送一次請求,服務端響應以後,連接即會斷掉;
  2. socket鏈接:長鏈接。即客戶端一旦與服務器創建接連,便不會主動斷掉。

HTTP 的post與get區別與聯繫,實踐中如何選擇它們?

  1. get是從服務器上獲取數據,post是向服務器傳送數據。
  2. 在客戶端,Get方式在經過URL提交數據,數據在URL中能夠看到;POST方式,數據放置在HTML HEADER內提交。
  3. 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
  4. GET方式提交的數據最多隻能有1024字節,而POST則沒有此限制。
  5. 安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。因此,若是這些數據是中文數據並且是非敏感數據,那麼使用 get;若是用戶輸入的數據不是中文字符並且包含敏感數據,那麼仍是使用 post爲好。
    Http定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,咱們能夠這樣認爲:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操做。GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息。

檢查內存管理問題的方式有哪些

  1. 點擊Xcode頂部菜單中的ProductàAnalyze。這種方法主要能夠查看內存泄露,變量未初始化,變量定義後沒有被使用到
  2. 使用Instrument工具檢查。點擊Xcode頂部菜單中的Product Profile,彈出一個界面,選擇左側的Memory後,再選右側的Leaks。
  3. 人工檢查

談安卓與蘋果的優缺點

蘋果系統優勢是左右流暢,軟件多,界面華麗,圖標統一,很美觀;缺點是系統封閉,不容許用戶過多的個性化設置,並且只能在蘋果手機上用。安卓系統優勢是開放,能夠本身擴展的東西不少,支持的硬件也多,各個價位的手機都有;缺點就是軟件太雜亂,兼容性有問題,圖標混亂不美觀。iOS的確比android流暢,這僅僅體如今較大軟件切換時,其餘差很少流暢,iOS並不能作到徹底後臺,若是它徹底後臺估計也不會比安卓流暢多少。反之,若是安卓只是注重單個運行,流暢度也會大大提高,iOS系統更新沒有android那麼頻繁,愛體驗的人會選安卓,那些怕煩的會選iOS。iOS的硬件需求選不及android,以致於android機會相對iOS較熱,較費電額。

大神篇

運行時你是怎麼理解的?

ObjC Runtime 實際上是一個 Runtime 庫,基本上用 C 和彙編寫的,這個庫使得 C 語言有了面向對象的能力(腦中浮現當你喬幫主參觀了施樂帕克的 SmallTalk 以後嘴角一抹淺笑)。這個庫作的事前就是加載類的信息,進行方法的分發和轉發之類的。OC是一種面向runtime(運行時)的語言,也就是說,它會盡量地把代碼執行的決策從編譯和連接的時候,推遲到運行時。這給程序員寫代碼帶來很大的靈活性,好比說你能夠把消息轉發給你想要的對象,或者隨意交換一個方法的實現之類的。這就要求runtime能檢測一個對象是否能對一個方法進行響應,而後再把這個方法分發到對應的對象去。

@protocol 和 category 中如何使用 @property

  1. 在 protocol 中使用 property 只會生成 setter 和 getter 方法聲明,咱們使用屬性的目的,是但願遵照我協議的對象能實現該屬性
  2. category 使用 @property 也是隻會生成 setter 和 getter 方法的聲明,若是咱們真的須要給 category 增長屬性的實現,須要藉助於運行時的兩個函數:
  • objc_setAssociatedObject
  • objc_getAssociatedObject

runtime如何經過selector找到對應的IMP地址?

每個類對象中都一個方法列表,方法列表中記錄着方法的名稱,方法實現,以及參數類型,其實selector本質就是方法名稱,經過這個方法名稱就能夠在方法列表中找到對應的方法實現.

一個objc對象如何進行內存佈局?

  1. 全部父類的成員變量和本身的成員變量都會存放在該對象所對應的存儲空間中.
  2. 每個對象內部都有一個isa指針,指向他的類對象,類對象中存放着本對象的
  • 對象方法列表(對象可以接收的消息列表,保存在它所對應的類對象中)
  • 成員變量的列表,
  • 屬性列表,

它內部也有一個isa指針指向元對象(meta class),元對象內部存放的是類方法列表,類對象內部還有一個superclass的指針,指向他的父類對象。

另外.....

個人願望是.......

世界和平.........

相關文章
相關標籤/搜索