將會遇到的iOS面試題二

  1. @synthesize和@dynamic分別有什么作用?

@property有兩個對應的詞,一個是@synthesize,一個是dynamic,默認是@synthesize ,會自動生成下劃線成員變量的getter和setter方法,
而dynamic會告訴編譯器:屬性的setter和getter方法由用戶自己實現(xiàn),不自動生成,假如一個屬性被聲明為@dynamic,而又沒有提供getter 和setter方法,編譯時不會有問題,而當程序運行時,當用到getter和setter方法的以后程序就會crash,這就是所謂的動態(tài)綁定。

  1. ARC下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?

對于基本數(shù)據(jù)類型:atomic、readwrite、assign
對于對象:atomic、readwrite、strong

  1. 用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?
  • 因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
  • 如果我們使用是 strong ,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.
  • copy設置方法不保留新值,而是將其”拷貝“。NSString用copy是為了保護其封裝性,防止字符串的值在對象不知情的情況下遭人修改
    原文鏈接
  1. @synthesize合成實例變量的規(guī)則是什么?假如property名為foo,存在一個名為_foo的實例變量,那么還會自動合成新變量么?
  • 如果指定了成員變量的名稱,會生成一個指定的名稱的成員變量,
  • 如果這個成員已經(jīng)存在了就不再生成了.
  • 如果是 @synthesize foo;
    還會生成一個名稱為foo的成員變量,也就是說:
    如果沒有指定成員變量的名稱會自動生成一個屬性同名的成員變量,
  • 如果是 @synthesize foo = _foo;
    就不會生成成員變量了.
    不會
    原文鏈接
  1. 在有了自動合成屬性實例變量之后,@synthesize還有哪些使用場景?

實例變量 = 成員變量 = ivar
當想要手動管理@property的所有內(nèi)容時,會通過實現(xiàn) @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 來達到這個目的,這時編譯器就會認為你打算手動管理 @property,于是編譯器就禁用了 autosynthesis(自動合成)。
原文鏈接

  1. objc中向一個對象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關系?

該方法編譯之后就是objc_msgSend()函數(shù)調(diào)用.

  1. 什么時候會報unrecognized selector的異常?

當調(diào)用該對象上某個方法,而該對象上沒有實現(xiàn)這個方法的時候, 可以通過“消息轉發(fā)”進行解決。
objc在向一個對象發(fā)送消息時,runtime庫會根據(jù)對象的isa指針找到該對象實際所屬的類,然后在該類中的方法列表以及其父類方法列表中尋找方法運行,如果,在最頂層的父類中依然找不到相應的方法時,程序在運行時會掛掉并拋出異常unrecognized selector sent to XXX 。但是在這之前,objc的運行時會給出三次拯救程序崩潰的機會:

  • Method resolution
    objc運行時會調(diào)用+resolveInstanceMethod:或者 +resolveClassMethod:,讓你有機會提供一個函數(shù)實現(xiàn)。如果你添加了函數(shù),那運行時系統(tǒng)就會重新啟動一次消息發(fā)送的過程,否則 ,運行時就會移到下一步,消息轉發(fā)(Message Forwarding)。
  • Fast forwarding
    如果目標對象實現(xiàn)了-forwardingTargetForSelector:,Runtime 這時就會調(diào)用這個方法,給你把這個消息轉發(fā)給其他對象的機會。 只要這個方法返回的不是nil和self,整個消息發(fā)送的過程就會被重啟,當然發(fā)送的對象會變成你返回的那個對象。否則,就會繼續(xù)Normal Fowarding。 這里叫Fast,只是為了區(qū)別下一步的轉發(fā)機制。因為這一步不會創(chuàng)建任何新的對象,但下一步轉發(fā)會創(chuàng)建一個NSInvocation對象,所以相對更快點。
    1. Normal forwarding
      這一步是Runtime最后一次給你挽救的機會。首先它會發(fā)送-methodSignatureForSelector:消息獲得函數(shù)的參數(shù)和返回值類型。如果-methodSignatureForSelector:返回nil,Runtime則會發(fā)出-doesNotRecognizeSelector:消息,程序這時也就掛掉了。如果返回了一個函數(shù)簽名,Runtime就會創(chuàng)建一個NSInvocation對象并發(fā)送-forwardInvocation:消息給目標對象
  1. 一個objc對象如何進行內(nèi)存布局?(考慮有父類的情況)

  2. 一個objc對象的isa的指針指向什么?有什么作用?

指向他的類對象,從而可以找到對象上的方法

  1. runtime如何通過selector找到對應的IMP地址?(分別考慮類方法和實例方法)

每一個類對象中都一個方法列表,方法列表中記錄著方法的名稱,方法實現(xiàn),以及參數(shù)類型,其實selector本質(zhì)就是方法名稱,通過這個方法名稱就可以在方法列表中找到對應的方法實現(xiàn).

  1. 使用runtime Associate方法關聯(lián)的對象,需要在主對象dealloc的時候釋放么?

無論在MRC下還是ARC下均不需要。

  1. objc中的類方法和實例方法有什么本質(zhì)區(qū)別和聯(lián)系?
  1. _objc_msgForward函數(shù)是做什么的,直接調(diào)用它將會發(fā)生什么?

  2. runtime如何實現(xiàn)weak變量的自動置nil?

  3. 能否向編譯后得到的類中增加實例變量?能否向運行時創(chuàng)建的類中添加實例變量?為什么?

  4. runloop和線程有什么關系?

  5. runloop的mode作用是什么?

  6. 以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer,在滑動頁面上的列表時,timer會暫定回調(diào),為什么?如何解決?

  7. 猜想runloop內(nèi)部是如何實現(xiàn)的?

  8. objc使用什么機制管理對象內(nèi)存?

  9. ARC通過什么方式幫助開發(fā)者管理內(nèi)存?

  10. 不手動指定autoreleasepool的前提下,一個autorealese對象在什么時刻釋放?(比如在一個vc的viewDidLoad中創(chuàng)建)

  11. BAD_ACCESS在什么情況下出現(xiàn)?

  12. 蘋果是如何實現(xiàn)autoreleasepool的?

  13. 使用block時什么情況會發(fā)生引用循環(huán),如何解決?

  14. 在block內(nèi)如何修改block外部變量?

  15. 使用系統(tǒng)的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環(huán)問題?

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

串行隊列、并發(fā)隊列

  1. 如何用GCD同步若干個異步調(diào)用?(如根據(jù)若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)

  2. dispatch_barrier_async的作用是什么?

  3. 蘋果為什么要廢棄dispatch_get_current_queue?

dispatch_get_current_queue容易造成死鎖。


  1. 什么是arc?(arc是為了解決什么問題誕生的?)

ARC是Auto Reference Counting的縮寫,即自動引用計數(shù),由編譯器在代碼合適的位置中自動添加retain/Release/Autorelease/dealloc方法從而進行內(nèi)存管理.
ARC幾個要點:
在對象被創(chuàng)建時 retain count +1,在對象被release時 retain count -1.當retain count 為0 時,銷毀對象。
程序中加入autoreleasepool的對象會由系統(tǒng)自動加上autorelease方法,如果該對象引用計數(shù)為0,則銷毀。
那么ARC是為了解決什么問題誕生的呢?這個得追溯到MRC手動內(nèi)存管理時代說起。
MRC下內(nèi)存管理的缺點:
當我們要釋放一個堆內(nèi)存時,首先要確定指向這個堆空間的指針都被release了。(避免提前釋放)
釋放指針指向的堆空間,首先要確定哪些指針指向同一個堆,這些指針只能釋放一次。(MRC下即誰創(chuàng)建,誰釋放,避免重復釋放)
模塊化操作時,對象可能被多個模塊創(chuàng)建和使用,不能確定最后由誰去釋放。
多線程操作時,不確定哪個線程最后使用完畢

  1. 請解釋以下keywords的區(qū)別: assign vs weak, __block vs __weak

__block 說明符就為 block 提供了變量的修改權.
后者是 所有權修飾符 , 什么是所有權修飾符? 這里涉及到另一個問題, 因為在 ARC 有效時, id 類型和對象類型同 C 語言中的其他類型不同, 必須附加所有權修飾符. 所有權修飾符一種有 4 種:
__strong
__weak
__unsafe_unretained
__autorelease
__weak 與 weak 的區(qū)別只在于, 前者用于變量的聲明, 而后者用于屬性的聲明.
__block和__weak修飾符的區(qū)別其實是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數(shù)據(jù)類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)。
3.__block對象可以在block中被重新賦值,__weak不可以。
也就是說,在MRC下,我們通常使用__block,而在ARC下我們通常使用__weak,或者__unsafe_unretained __block(不安全,不建議使用)來修飾防止循環(huán)引用而造成的內(nèi)存泄露。

  1. __block在arc和非arc下含義一樣嗎?
  • 非arc下 __block修飾的變量的引用計算是不變的
  • arc iOS5之后用__weak iOS, 5之前可以用__unsafe_unretained
  • arc下__block 使block可以訪問并修改外部變量
  1. 使用atomic一定是線程安全的嗎?

atomic:原子屬性,為setter方法加鎖(默認就是atomic)
nonatomic:非原子屬性,不會加鎖
atomic:線程安全,需要消耗大量的資源
nonatomic:非線程安全,適合內(nèi)存小的移動設備

  1. 描述一個你遇到過的retain cycle例子。(別撒謊,你肯定遇到過)

  2. +(void)load; +(void)initialize;有什么用處?

load:類初始化加載時調(diào)用,調(diào)用順序是父類優(yōu)于子類,子類優(yōu)于分類
initialize:第一次調(diào)用類的類方法或實例方法之前調(diào)用
這兩個方法只有實現(xiàn)了才會被調(diào)用

  1. 為什么其他語言里叫函數(shù)調(diào)用, objective c里則是給對象發(fā)消息(或者談下對runtime的理解)

在java中,類和方法在編譯期就綁定在一起
在OC中,方法調(diào)用是向類發(fā)送消息,如(bady cry)在運行時會轉換成objc_msgSend(bady,cry),向對象發(fā)送消息時根據(jù)isa指針找到類,在根據(jù)類的調(diào)度表查找方法,沒找到方法則在父類中查找直至基類,如果始終沒有找到返回nil
Objective-C 的 Runtime 鑄就了它動態(tài)語言的特性,這些深層次的知識雖然平時寫代碼用的少一些,但是卻是每個 Objc 程序員需要了解的。Objc Runtime使得C具有了面向對象能力,在程序運行時創(chuàng)建,檢查,修改類、對象和它們的方法。可以使用runtime的一系列方法實現(xiàn)。

  1. 什么是method swizzling?

  2. UIView和CALayer是啥關系?

  1. 首先UIView可以響應事件,Layer不可以.
    UIApplication、UIViewController、UIView、和所有從UIView派生出來的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類。
    CALayer直接繼承 NSObject,并沒有相應的處理事件的接口。
  2. UIView是CALayer的delegate
  3. UIView主要處理事件,CALayer負責繪制就更好
  4. 每個 UIView 內(nèi)部都有一個 CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供。兩者都有樹狀層級結構,layer 內(nèi)部有 SubLayers,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個AnchorPoint
  1. 如何高性能的給UIImageView加個圓角?(不準說layer.cornerRadius!)

  2. 使用drawRect有什么影響?(這個可深可淺,你至少得用過。。)

  3. ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的?(把UIImageView放到UITableViewCell里面問更贊)

  4. 麻煩你設計個簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)

  5. 講講你用Instrument優(yōu)化動畫性能的經(jīng)歷吧(別問我什么是Instrument)

  6. loadView是干嘛用的?

loadview在view為nil時調(diào)用,早于ViewDidLoad
當用到nib文件時,加載nib文件
沒有用到,默認創(chuàng)建一個空view,可以自定義一個view賦值給self.view,不必調(diào)用super

  1. viewWillLayoutSubView你總是知道的。
    鏈接

  2. GCD里面有哪幾種Queue?你自己建立過串行queue嗎?背后的線程模型是什么樣的?

  3. 用過coredata或者sqlite嗎?讀寫是分線程的嗎?遇到過死鎖沒?咋解決的?

  4. http的post和get啥區(qū)別?(區(qū)別挺多的,麻煩多說點)

  5. 我知道你大學畢業(yè)過后就沒接觸過算法數(shù)據(jù)結構了,但是請你一定告訴我什么是Binary search tree? search的時間復雜度是多少?我很想知道!

產(chǎn)品設計方面問題

  • iOS應用圖標是指什么?請盡可能詳細地描述一下。

  • 最小尺寸和最大尺寸的應用圖標分別是什么樣子的?

  • 應用圖標能否包含透明的部分?

  • Newsstand的圖標與常規(guī)應用有何不同?

  • 請解釋一下啟動畫面(Launch Images)。

  • 自動布局(Auto Layout)的作用是什么?請概括一下它是如何* 運行的。

  • 設計軟件時為什么要加上動畫?

  • 請描述一下軟件設計中的交互和Feedback有什么作用。

  • 設計iPhone和iPad應用時,應分別考慮哪些因素?

  • 請描述一下原型設計對于軟件開發(fā)的意義。其作用是什么?

  • 關于App Store

  • 應用內(nèi)購買(In-App Purchases)是怎么回事?IAP能夠為用戶帶來哪些新體驗?

  • 你是否在App Store上發(fā)布過應用?能否概括一下過程?

  • iTunes Connect是什么?

  • Provisioning Profiles是指?

  • App ID是什么?

  • iOS的開發(fā)和發(fā)布簽名證書有何異同?

  • 如何使用TestFlight?通過Ad-hoc發(fā)布應用的話,該如何使用UUID?

  • 應何時驗證購買收據(jù)?
    *發(fā)布iAds(蘋果平臺廣告)有哪些要求?

面經(jīng)分享
鏈接:[iOS]關于面試,做一次整理吧(包含BAT面試題目)

高頻率重點問題:

1.說說 UITableView 的調(diào)優(yōu)。

一方面是通過 instruments 檢查影響性能的地方,另一方面是估
算高度并在 runloop 空閑時緩存。

  1. 談談你對 ARC 的理解。

ARC 是編譯器完成的,依靠引用計數(shù),談談幾個屬性修飾符的內(nèi)存管理策略,什么情況下會內(nèi)存泄露。

3.MVC 具有什么樣的優(yōu)勢,各個模塊之間怎么通信,比如點擊 Button 后 怎么通知 Model?

4.KVO、Notification、delegate 各自的優(yōu)缺點,效率還有使用場景

  1. 當接收者不需要關注發(fā)送者,只關注此消息,并且消息傳遞是單向時,使用Notifications
  2. block是iOS4加入的,

5.如何手動通知 KVO

6.runtime 中,SEL 和 IMP 的區(qū)別

7.autoreleasepool 的使用場景和原理

8.RunLoop 的實現(xiàn)原理和數(shù)據(jù)結構,什么時候會用到

9.使用 GCD 如何實現(xiàn)這個需求:A、B、C 三個任務并發(fā),完成后執(zhí)行任務 D。

10.如何設計圖片緩存?

11.說說你對 OC 中 load 方法和 initialize 方法的異同?!饕f一下執(zhí)行時間,各自用途,沒實現(xiàn)子類的方法會不會調(diào)用父類的?

12.說說你對 block 的理解?!?三種 block,棧上的自動復制到堆上,block 的屬性修飾符是 copy,循環(huán)引用的原理和解決方案。

鏈接:objc 中的 block

  • 編譯器會根據(jù)block捕獲的變量,生成具體的結構體定義。block內(nèi)部的代碼提取成一個單獨的C函數(shù)。
    創(chuàng)建block時,實際就是在方法中聲明一個結構體(struct),并且初始化該struct的成員,執(zhí)行block時,就是調(diào)用單獨的C函數(shù),并把struct指針傳遞過去。
  • block中包含了被引用的自由變量(由struct持有),也包含了控制成分的代碼塊(由函數(shù)指針持有),符合閉包(closure)的概念。
  • block中的isa指向的是該block的Class
    _NSConcreteStackBlock 棧上創(chuàng)建的block
    _NSConcreteMallocBlock 堆上創(chuàng)建的block
    _NSConcreteGlobalBlock 作為全局變量的block

1.怎么判斷某個 cell 是否顯示在屏幕上
2.TCP 流量控制
3.數(shù)組和鏈表的區(qū)別
4.UIView 生命周期
5.如果頁面 A 跳轉到 頁面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪個先調(diào)用?
6.ARC 的本質(zhì)
ARC是iOS5推出的
7.RunLoop 的基本概念,它是怎么休眠的?
8.如何找到字符串中第一個不重復的字符
9.哈希表如何處理沖突

騰訊
如何繪制一個三角形?
1.1 如何繪制大量三角形?
1.2 一定要重寫drawRect嗎?
1.3 如何刷新View界面?
1.4 Layer好在哪?
assign和weak的區(qū)別
線程和RunLoop的關系
3.1 一個autorealese對象在什么時刻釋放?(比如在一個vc的viewDidLoad中創(chuàng)建)
NSTimer有什么需注意的以及和RunLoop的關系?
NSString copy 和 NSString mutableCopy 的區(qū)別
線程加鎖原理(信號量,臨界區(qū),自選鎖)
iOS7 - iOS9的區(qū)別
GCD指向了野指針了怎么辦
用HTTP傳數(shù)據(jù),丟包嚴重怎么辦
iOS中廣播的種類
app slying
runtime如何實現(xiàn)weak變量的自動置nil?
AFNetworking的內(nèi)部實現(xiàn)原理?
block循環(huán)引用了如何解決?
如何用GCD同步若干個異步調(diào)用?(如根據(jù)若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)
UIKit的框架結構?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容