- @synthesize和@dynamic分別有什么作用?
@property有兩個對應的詞,一個是@synthesize,一個是dynamic,默認是@synthesize ,會自動生成下劃線成員變量的getter和setter方法,
而dynamic會告訴編譯器:屬性的setter和getter方法由用戶自己實現(xiàn),不自動生成,假如一個屬性被聲明為@dynamic,而又沒有提供getter 和setter方法,編譯時不會有問題,而當程序運行時,當用到getter和setter方法的以后程序就會crash,這就是所謂的動態(tài)綁定。
- ARC下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?
對于基本數(shù)據(jù)類型:atomic、readwrite、assign
對于對象:atomic、readwrite、strong
- 用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?
- 因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
- 如果我們使用是 strong ,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.
- copy設置方法不保留新值,而是將其”拷貝“。NSString用copy是為了保護其封裝性,防止字符串的值在對象不知情的情況下遭人修改
原文鏈接
- @synthesize合成實例變量的規(guī)則是什么?假如property名為foo,存在一個名為_foo的實例變量,那么還會自動合成新變量么?
- 如果指定了成員變量的名稱,會生成一個指定的名稱的成員變量,
- 如果這個成員已經(jīng)存在了就不再生成了.
- 如果是 @synthesize foo;
還會生成一個名稱為foo的成員變量,也就是說:
如果沒有指定成員變量的名稱會自動生成一個屬性同名的成員變量,- 如果是 @synthesize foo = _foo;
就不會生成成員變量了.
不會
原文鏈接
- 在有了自動合成屬性實例變量之后,@synthesize還有哪些使用場景?
實例變量 = 成員變量 = ivar
當想要手動管理@property的所有內(nèi)容時,會通過實現(xiàn) @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 來達到這個目的,這時編譯器就會認為你打算手動管理 @property,于是編譯器就禁用了 autosynthesis(自動合成)。
原文鏈接
- objc中向一個對象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關系?
該方法編譯之后就是objc_msgSend()函數(shù)調(diào)用.
- 什么時候會報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對象,所以相對更快點。
- Normal forwarding
這一步是Runtime最后一次給你挽救的機會。首先它會發(fā)送-methodSignatureForSelector:消息獲得函數(shù)的參數(shù)和返回值類型。如果-methodSignatureForSelector:返回nil,Runtime則會發(fā)出-doesNotRecognizeSelector:消息,程序這時也就掛掉了。如果返回了一個函數(shù)簽名,Runtime就會創(chuàng)建一個NSInvocation對象并發(fā)送-forwardInvocation:消息給目標對象
一個objc對象如何進行內(nèi)存布局?(考慮有父類的情況)
一個objc對象的isa的指針指向什么?有什么作用?
指向他的類對象,從而可以找到對象上的方法
- runtime如何通過selector找到對應的IMP地址?(分別考慮類方法和實例方法)
每一個類對象中都一個方法列表,方法列表中記錄著方法的名稱,方法實現(xiàn),以及參數(shù)類型,其實selector本質(zhì)就是方法名稱,通過這個方法名稱就可以在方法列表中找到對應的方法實現(xiàn).
- 使用runtime Associate方法關聯(lián)的對象,需要在主對象dealloc的時候釋放么?
無論在MRC下還是ARC下均不需要。
- objc中的類方法和實例方法有什么本質(zhì)區(qū)別和聯(lián)系?
- 類方法:
類方法是屬于類對象的
類方法只能通過類對象調(diào)用
類方法中的self是類對象
類方法可以調(diào)用其他的類方法
類方法中不能訪問成員變量
類方法中不能直接調(diào)用對象方法- 實例方法:
實例方法是屬于實例對象的
實例方法只能通過實例對象調(diào)用
實例方法中的self是實例對象
實例方法中可以訪問成員變量
實例方法中直接調(diào)用實例方法
實例方法中也可以調(diào)用類方法(通過類名)
以上答案在《招聘一個靠譜的 iOS》—參考答案(上)
下面答案在《招聘一個靠譜的 iOS》—參考答案(下)
_objc_msgForward函數(shù)是做什么的,直接調(diào)用它將會發(fā)生什么?
runtime如何實現(xiàn)weak變量的自動置nil?
能否向編譯后得到的類中增加實例變量?能否向運行時創(chuàng)建的類中添加實例變量?為什么?
runloop和線程有什么關系?
runloop的mode作用是什么?
以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer,在滑動頁面上的列表時,timer會暫定回調(diào),為什么?如何解決?
猜想runloop內(nèi)部是如何實現(xiàn)的?
objc使用什么機制管理對象內(nèi)存?
ARC通過什么方式幫助開發(fā)者管理內(nèi)存?
不手動指定autoreleasepool的前提下,一個autorealese對象在什么時刻釋放?(比如在一個vc的viewDidLoad中創(chuàng)建)
BAD_ACCESS在什么情況下出現(xiàn)?
蘋果是如何實現(xiàn)autoreleasepool的?
使用block時什么情況會發(fā)生引用循環(huán),如何解決?
在block內(nèi)如何修改block外部變量?
使用系統(tǒng)的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環(huán)問題?
GCD的隊列(dispatch_queue_t)分哪兩種類型?
串行隊列、并發(fā)隊列
如何用GCD同步若干個異步調(diào)用?(如根據(jù)若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)
dispatch_barrier_async的作用是什么?
蘋果為什么要廢棄dispatch_get_current_queue?
dispatch_get_current_queue容易造成死鎖。
- 什么是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)建和使用,不能確定最后由誰去釋放。
多線程操作時,不確定哪個線程最后使用完畢
- 請解釋以下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)存泄露。
- __block在arc和非arc下含義一樣嗎?
- 非arc下 __block修飾的變量的引用計算是不變的
- arc iOS5之后用__weak iOS, 5之前可以用__unsafe_unretained
- arc下__block 使block可以訪問并修改外部變量
- 使用atomic一定是線程安全的嗎?
atomic:原子屬性,為setter方法加鎖(默認就是atomic)
nonatomic:非原子屬性,不會加鎖
atomic:線程安全,需要消耗大量的資源
nonatomic:非線程安全,適合內(nèi)存小的移動設備
描述一個你遇到過的retain cycle例子。(別撒謊,你肯定遇到過)
+(void)load; +(void)initialize;有什么用處?
load:類初始化加載時調(diào)用,調(diào)用順序是父類優(yōu)于子類,子類優(yōu)于分類
initialize:第一次調(diào)用類的類方法或實例方法之前調(diào)用
這兩個方法只有實現(xiàn)了才會被調(diào)用
- 為什么其他語言里叫函數(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)。
什么是method swizzling?
UIView和CALayer是啥關系?
- 首先UIView可以響應事件,Layer不可以.
UIApplication、UIViewController、UIView、和所有從UIView派生出來的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類。
CALayer直接繼承 NSObject,并沒有相應的處理事件的接口。- UIView是CALayer的delegate
- UIView主要處理事件,CALayer負責繪制就更好
- 每個 UIView 內(nèi)部都有一個 CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供。兩者都有樹狀層級結構,layer 內(nèi)部有 SubLayers,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個AnchorPoint
如何高性能的給UIImageView加個圓角?(不準說layer.cornerRadius!)
使用drawRect有什么影響?(這個可深可淺,你至少得用過。。)
ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的?(把UIImageView放到UITableViewCell里面問更贊)
麻煩你設計個簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)
講講你用Instrument優(yōu)化動畫性能的經(jīng)歷吧(別問我什么是Instrument)
loadView是干嘛用的?
loadview在view為nil時調(diào)用,早于ViewDidLoad
當用到nib文件時,加載nib文件
沒有用到,默認創(chuàng)建一個空view,可以自定義一個view賦值給self.view,不必調(diào)用super
viewWillLayoutSubView你總是知道的。
鏈接GCD里面有哪幾種Queue?你自己建立過串行queue嗎?背后的線程模型是什么樣的?
用過coredata或者sqlite嗎?讀寫是分線程的嗎?遇到過死鎖沒?咋解決的?
http的post和get啥區(qū)別?(區(qū)別挺多的,麻煩多說點)
我知道你大學畢業(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 空閑時緩存。
- 談談你對 ARC 的理解。
ARC 是編譯器完成的,依靠引用計數(shù),談談幾個屬性修飾符的內(nèi)存管理策略,什么情況下會內(nèi)存泄露。
3.MVC 具有什么樣的優(yōu)勢,各個模塊之間怎么通信,比如點擊 Button 后 怎么通知 Model?
4.KVO、Notification、delegate 各自的優(yōu)缺點,效率還有使用場景
- 當接收者不需要關注發(fā)送者,只關注此消息,并且消息傳遞是單向時,使用Notifications
- 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)引用的原理和解決方案。
- 編譯器會根據(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的框架結構?