iOS面試題

一個(gè)區(qū)分度很大的面試題

考察一個(gè)面試者基礎(chǔ)咋樣,基本上問(wèn)一個(gè) @property 就夠了:

@property 后面可以有哪些修飾符?

  • 線程安全的:
    • atomic,nonatomic
  • 訪問(wèn)權(quán)限的
    • readonly,readwrite
  • 內(nèi)存管理(ARC)
    • assign,strong,weak,copy
  • 內(nèi)存管理(MRC)
  • assign,retain,copy
  • 指定方法名稱
  • setter=
  • getter=

什么情況使用 weak 關(guān)鍵字,相比 assign 有什么不同?比如:

  • 在ARC中,出現(xiàn)循環(huán)引用的時(shí)候,必須要有一端使用weak,比如:自定義View的代理屬性
  • 已經(jīng)自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)應(yīng)用,沒(méi)有必要在強(qiáng)引用一次,此時(shí)也會(huì)使用weak,自定義View的子控件屬性一般也使用weak;但b是也可以使用strong
  • weak當(dāng)對(duì)象銷毀的時(shí)候,指針會(huì)被自動(dòng)設(shè)置為nil,而assign不會(huì)* assigin 可以用非OC對(duì)象,而weak必須用于OC對(duì)象

怎么用 copy 關(guān)鍵字?

  • 對(duì)于字符串和block的屬性一般使用copy
  • 字符串使用copy是為了外部把字符串內(nèi)容改了,影響該屬性
  • block使用copy是在MRC遺留下來(lái)的,在MRC中,方法內(nèi)部的block是在在棧區(qū)的,使用copy可以把它放到堆區(qū).在ACR中對(duì)于block使用copy還是strong效果是一樣的

這個(gè)寫(xiě)法會(huì)出什么問(wèn)題: @property (copy) NSMutableArray *array;

  • 添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)于的方法而崩潰.因?yàn)閏opy就是復(fù)制一個(gè)不可變NSArray的對(duì)象

如何讓自己的類用 copy 修飾符?

  • 你是說(shuō)讓我的類也支持copy的功能嗎?
  • 如果面試官說(shuō)是:
    • 遵守NSCopying協(xié)議
    • 實(shí)現(xiàn) - (id)copyWithZone:(NSZone *)zone; 方法
  • 如果面試官說(shuō)否,是屬性中如何使用copy
    • 在使用字符串和block的時(shí)候一般都使用copy

如何重寫(xiě)帶 copy 關(guān)鍵字的 setter?

  • 重寫(xiě)copy的setter方法時(shí)候,一定要調(diào)用一下傳入的對(duì)象的copy方法,然后在賦值給該setter的方法對(duì)應(yīng)的成員變量

這一套問(wèn)題區(qū)分度比較大,如果上面的問(wèn)題都能回答正確,可以延伸問(wèn)更深入點(diǎn)的:

@property 的本質(zhì)是什么?ivar、getter、setter 是如何生成并添加到這個(gè)類中的
  • 在普通的OC對(duì)象中,@property就是編譯其自動(dòng)幫我們生成一個(gè)私有的成員變量和setter與getter方法的聲明和實(shí)現(xiàn)
  • 我為了搞清屬性是怎么實(shí)現(xiàn)的,曾經(jīng)反編譯過(guò)相關(guān)的代碼,他大致生成了五個(gè)個(gè)東西
  • OBJC_IVAR_$類名$屬性名稱 該屬性的偏移量
  • setter與getter方法對(duì)應(yīng)的實(shí)現(xiàn)函數(shù)
  • ivar_list 就是成員變量列表
  • method_list 方法列表
  • prop_list 屬性列表
    也就是說(shuō)我們每次在增加一個(gè)屬性,系統(tǒng)都會(huì)在ivar_list中添加一個(gè)成員變量的描述,在method_list中增加setter與getter方法的描述,在屬性列表中增加一個(gè)屬性的屬性的描述,然后計(jì)算該屬性在對(duì)象中的偏移量,然后伸出setter與getter方法對(duì)應(yīng)的實(shí)現(xiàn),在setter方法方法中從偏移量的位置開(kāi)始賦值,在getter方法中從偏移量開(kāi)始取值,為了能夠讀取正確字節(jié)數(shù),系統(tǒng)對(duì)象偏移量的指針類型進(jìn)行了類型強(qiáng)轉(zhuǎn).
@protocol 和 category 中如何使用 @property
  1. 在protocol中使用property只會(huì)生成setter和getter方法聲明,我們使用屬性的目的,是希望遵守我協(xié)議的對(duì)象的實(shí)現(xiàn)該屬性
  2. category 使用 @property 也是只會(huì)生成setter和getter方法的聲明,如果我們真的需要給category增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行時(shí)的兩個(gè)函數(shù)
    1. objc_setAssociatedObject
    2. objc_getAssociatedObject
runtime 如何實(shí)現(xiàn) weak 屬性

runtime 對(duì)注冊(cè)的類, 會(huì)進(jìn)行布局,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中。 用 weak 指向的對(duì)象地址作為 key,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì) dealloc, 進(jìn)而在這個(gè) weak 表中找到此對(duì)象地址為鍵的所有 weak 對(duì)象,從而設(shè)置為 nil

每個(gè)人擅長(zhǎng)的領(lǐng)域不一樣,我們一般會(huì)從簡(jiǎn)歷上找自己寫(xiě)擅長(zhǎng)的技術(shù)聊,假如自己并不是很熟,最好別寫(xiě)出來(lái)或扯出來(lái),萬(wàn)一面試官剛好非常精通這里就露餡了。

Checklist

總結(jié)過(guò)些面試題,沒(méi)堅(jiān)持下去,后來(lái)把這些當(dāng) checklist,面試的時(shí)候?qū)嵲跊](méi)話聊的時(shí)候做個(gè)提醒,語(yǔ)言、框架、運(yùn)行機(jī)制性質(zhì)的:

[※]@property中有哪些屬性關(guān)鍵字?

同上

[※]weak屬性需要在dealloc中置nil么?

不需要,在ARC環(huán)境無(wú)論是強(qiáng)指針還是弱指針都無(wú)需在deallco設(shè)置為nil,ARC會(huì)自動(dòng)幫我們處理

[※※]@synthesize和@dynamic分別有什么作用?

  1. @property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是@synthesize,一個(gè)是@dynamic。如果@synthesize和@dynamic都沒(méi)寫(xiě),那么默認(rèn)的就是@syntheszie var = _var;
  2. @synthesize的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn)setter方法和getter方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法。
  3. @dynamic告訴編譯器,屬性的setter與getter方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成。(當(dāng)然對(duì)于readonly的屬性只需提供getter即可)。假如一個(gè)屬性被聲明為@dynamic var,然后你沒(méi)有提供@setter方法和@getter方法,編譯的時(shí)候沒(méi)問(wèn)題,但是當(dāng)程序運(yùn)行到instance.var =someVar,由于缺setter方法會(huì)導(dǎo)致程序崩潰;或者當(dāng)運(yùn)行到 someVar = var時(shí),由于缺getter方法同樣會(huì)導(dǎo)致崩潰。編譯時(shí)沒(méi)問(wèn)題,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法,這就是所謂的動(dòng)態(tài)綁定。

[※※※]ARC下,不顯示指定任何屬性關(guān)鍵字時(shí),默認(rèn)的關(guān)鍵字都有哪些?

  1. 對(duì)應(yīng)基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字是
    atomic,readwrite,assign
  2. 對(duì)于普通的OC對(duì)象
    atomic,readwrite,strong

[※※※]用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問(wèn)題?

  1. 因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用copy的目的是為了讓本對(duì)象的屬性不受外界影響,使用copy無(wú)論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本.
  2. 如果我們使用是strong,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性.

[※※※]@synthesize合成實(shí)例變量的規(guī)則是什么?假如property名為foo,存在一個(gè)名為_(kāi)foo的實(shí)例變量,那么還會(huì)自動(dòng)合成新變量么?

如果沒(méi)有指定成員變量的名稱與自動(dòng)生成一個(gè)屬性同名的成員變量,如果指定的成員變量的名稱,會(huì)生成一個(gè)指定的名稱的成員變量,如果這個(gè)成員已經(jīng)存在了就不再生成了.
如果是 @synthesize foo; 還會(huì)生成一個(gè)名稱為foo的成員變量
如果是 @synthesize foo = _foo; 就不會(huì)生成成員變量了.

[※※※※※]在有了自動(dòng)合成屬性實(shí)例變量之后,@synthesize還有哪些使用場(chǎng)景?

@synthesize主要就是用來(lái)生成setter,getter方法的實(shí)現(xiàn),在@property被增強(qiáng)之后,其實(shí)已經(jīng)很少使用@synthesize了,你知道@synthesize的其他使用場(chǎng)景嗎? 能給我介紹一下嗎?
如果你聽(tīng)懂了,感覺(jué)面試官說(shuō)的很有道理,可以說(shuō)點(diǎn)贊美的話.

[※※]objc中向一個(gè)nil對(duì)象發(fā)送消息將會(huì)發(fā)生什么?

  1. 在Objective-C中向nil發(fā)送消息是完全有效的——只是在運(yùn)行時(shí)不會(huì)有任何作用:
    • 如果一個(gè)方法返回值是一個(gè)對(duì)象,那么發(fā)送給nil的消息將返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother];如果spouse對(duì)象為nil,那么發(fā)送給nil的消息mother也將返回nil。
    • 如果方法返回值為指針類型,其指針大小為小于或者等于sizeof(void*),float,double,long double 或者long long的整型標(biāo)量,發(fā)送給nil的消息將返回0。
    • 如果方法返回值為結(jié)構(gòu)體,發(fā)送給nil的消息將返回0。結(jié)構(gòu)體中各個(gè)字段的值將都是0。
    • 如果方法的返回值不是上述提到的幾種情況,那么發(fā)送給nil的消息的返回值將是未定義的。

[※※※]objc中向一個(gè)對(duì)象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系?

該方法編譯之后就是objc_msgSend()函數(shù)調(diào)用.如果我沒(méi)有記錯(cuò)的大概是這樣的.
((void (*)(id, SEL))(void *)objc_msgSend)((id)obj, sel_registerName("foo"));

[※※※]什么時(shí)候會(huì)報(bào)unrecognized selector的異常?

  • 當(dāng)該對(duì)象上某個(gè)方法,而該對(duì)象上沒(méi)有實(shí)現(xiàn)這個(gè)方法的時(shí)候

[※※※※]一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局?(考慮有父類的情況)

  • 所有父類的成員變量和自己的成員變量都會(huì)存放在該對(duì)象所對(duì)應(yīng)的存儲(chǔ)空間中.
  • 每一個(gè)對(duì)象內(nèi)部都一個(gè)isA指針,指向他的類對(duì)象,類對(duì)象中存放著本對(duì)象的對(duì)象方法列表和成員變量的列表,屬性列表,它內(nèi)部也有一個(gè)isA指針指向元對(duì)象(meta class),元對(duì)象內(nèi)部存放的是類方法列表,類對(duì)象內(nèi)部還有一個(gè)superclass的指針,指向他的父類對(duì)象
  • 根對(duì)象就是NSobject
  • 如圖:


[※※※※]一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用?

  • 指向他的類對(duì)象,從而可以找到對(duì)象上的方法

[※※※※]下面的代碼輸出什么?

@implementation Son : Father
- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

輸出的結(jié)果都是:Son,
原因:super 和 self 都是指向的本實(shí)例對(duì)象的,
不同的是,super調(diào)用的跳過(guò)本類方法,調(diào)用父類的方法
父類方法的class方法本來(lái)都是在基類中實(shí)現(xiàn)的,所以無(wú)論使用self和super調(diào)用都是一樣的.
具體分析參照刨根問(wèn)底Objective-C Runtime(1)- Self & Super

[※※※※]runtime如何通過(guò)selector找到對(duì)應(yīng)的IMP地址?(分別考慮類方法和實(shí)例方法)

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

[※※※※]使用runtime Associate方法關(guān)聯(lián)的對(duì)象,需要在主對(duì)象dealloc的時(shí)候釋放么?

  • 在ARC下不需要
  • 在MRC中,對(duì)于使用retain或copy策略的需要

[※※※※※]objc中的類方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系?

  • 類方法
    • 類方法是屬于類對(duì)象的
    • 類方法只能通過(guò)類對(duì)象調(diào)用
    • 類方法中的self是類對(duì)象
    • 類方法可以調(diào)用其他的類方法
    • 類方法中不能訪問(wèn)成員變量
    • 類方法中不定直接調(diào)用對(duì)象方法
  • 實(shí)例方法
    • 實(shí)例方法是屬于實(shí)例對(duì)象的
    • 實(shí)例方法只能通過(guò)實(shí)例對(duì)象調(diào)用
    • 實(shí)例方法中的self是實(shí)例對(duì)象
    • 實(shí)例方法中可以訪問(wèn)成員變量
    • 實(shí)例方法中直接調(diào)用實(shí)例方法
    • 實(shí)例方法中也可以調(diào)用類方法(通過(guò)類名)

[※※※※※]_objc_msgForward函數(shù)是做什么的,直接調(diào)用它將會(huì)發(fā)生什么?

  1. 沒(méi)喲研究過(guò),從名字來(lái)看是用來(lái)轉(zhuǎn)發(fā)消息的,你能給我講講嗎?謝謝!

[※※※※※]runtime如何實(shí)現(xiàn)weak變量的自動(dòng)置nil?

1. 沒(méi)有研究過(guò),你有研究過(guò)嗎,可以給我講講嗎?
2. 我猜系統(tǒng)會(huì)維護(hù)一個(gè)弱指針列表,當(dāng)某個(gè)對(duì)象銷毀時(shí)候,它會(huì)把所有指向該對(duì)象的弱指針設(shè)置為nil

[※※※※※]能否向編譯后得到的類中增加實(shí)例變量?能否向運(yùn)行時(shí)創(chuàng)建的類中添加實(shí)例變量?為什么?

    因?yàn)榫幾g后的類已經(jīng)注冊(cè)在 runtime 中,類結(jié)構(gòu)體中的 objc_ivar_list 實(shí)例變量的鏈表 和 instance_size 實(shí)例變量的內(nèi)存大小已經(jīng)確定,同時(shí)runtime 會(huì)調(diào)用 class_setIvarLayout 或 class_setWeakIvarLayout 來(lái)處理 strong weak 引用。所以不能向存在的類中添加實(shí)例變量,
運(yùn)行時(shí)創(chuàng)建的類是可以添加實(shí)例變量,調(diào)用 class_addIvar 函數(shù)。但是得在調(diào)用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上。

[※※※]runloop和線程有什么關(guān)系?

 1. 每一個(gè)線程中都一個(gè)runloop,只有主線的的runloop默認(rèn)是開(kāi)啟的,其他線程的runloop是默認(rèn)沒(méi)有開(kāi)啟的
 2. 可以通過(guò)CFRunLoopRun() 函數(shù)來(lái)開(kāi)啟一個(gè)事件循環(huán)
 3. 看SDWebImage源碼的時(shí)候見(jiàn)到有這么用過(guò).

[※※※]runloop的mode作用是什么?

model 主要是用來(lái)指定時(shí)間在運(yùn)行循環(huán)中的優(yōu)先級(jí)的
蘋(píng)果公開(kāi)提供的 Mode 有兩個(gè):
kCFRunLoopDefaultMode
kCFRunLoopCommonModes

如果我們把一個(gè)NSTimer對(duì)象以kCFRunLoopDefaultMode添加到主運(yùn)行循環(huán)中的時(shí)候,當(dāng)一直有用戶事件處理的時(shí)候,NSTimer將不再被調(diào)度
如果我們把一個(gè)NSTimer對(duì)象以kCFRunLoopCommonModes添加到主運(yùn)行循環(huán)中的時(shí)候,當(dāng)一直有用戶事件處理的時(shí)候,NSTimer還能正常的調(diào)度,互不影響.

[※※※※]以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer,在滑動(dòng)頁(yè)面上的列表時(shí),timer會(huì)暫定回調(diào),為什么?如何解決?

同上

[※※※※※]猜想runloop內(nèi)部是如何實(shí)現(xiàn)的?

  1. 他是一個(gè)死循環(huán)
  2.如果事件隊(duì)列中存放在事件,那就取出事件,執(zhí)行相關(guān)代碼
  3.如果沒(méi)有事件,就掛起,等有事件了,立即喚醒事件循環(huán),開(kāi)始執(zhí)行.

 簡(jiǎn)單來(lái)說(shuō)。。。
function loop() {
    initialize();
    do {
        var message = get_next_message();
        process_message(message);
    } while (message != quit);
} 

[※]objc使用什么機(jī)制管理對(duì)象內(nèi)存?

* MRC 手動(dòng)引用計(jì)數(shù)
* ARC 自動(dòng)引用計(jì)數(shù),現(xiàn)在通常使用自動(dòng)引用計(jì)數(shù)

[※※※※]ARC通過(guò)什么方式幫助開(kāi)發(fā)者管理內(nèi)存?

通過(guò)編譯器在編譯的時(shí)候,插入如內(nèi)管理的代碼

[※※※※]不手動(dòng)指定autoreleasepool的前提下,一個(gè)autorealese對(duì)象在什么時(shí)刻釋放?(比如在一個(gè)vc的viewDidLoad中創(chuàng)建)

在每次事件循環(huán)開(kāi)始創(chuàng)建自動(dòng)釋放池,在每次事件結(jié)束銷毀自動(dòng)釋放池
以viewDidLoad方法為例,可以理解為在viewDidLoad方法開(kāi)始執(zhí)行之前創(chuàng)建自動(dòng)釋放池,
在viewDidLoad方法執(zhí)行之后銷毀自動(dòng)釋放吃

[※※※※]BAD_ACCESS在什么情況下出現(xiàn)?

1.  死循環(huán)了
2.  訪問(wèn)一個(gè)僵尸對(duì)象

[※※※※※]蘋(píng)果是如何實(shí)現(xiàn)autoreleasepool的?

1. 我猜想autoreleasepool 本質(zhì)就是一個(gè)隊(duì)列(數(shù)組),
2. 當(dāng)調(diào)用autorelease的時(shí)候會(huì)把該對(duì)象添加到autoreleasepool中,并且把引用計(jì)數(shù)+1
3. 當(dāng)autoreleasepool即將銷毀的時(shí)候,把其中的所有對(duì)象進(jìn)行一次release操作

[※※]使用block時(shí)什么情況會(huì)發(fā)生引用循環(huán),如何解決?

 只要是一個(gè)對(duì)象對(duì)該block進(jìn)行了強(qiáng)引用,在block內(nèi)部有直接使用到該對(duì)象,

[※※]在block內(nèi)如何修改block外部變量?

  1. 通過(guò) __bock修改的外部變量,可以在block內(nèi)部修改
  2. 想裝B的話可以說(shuō)一下__bock內(nèi)部做了什么事

[※※※]使用系統(tǒng)的某些block api(如UIView的block版本寫(xiě)動(dòng)畫(huà)時(shí)),是否也考慮引用循環(huán)問(wèn)題?

一般不用考慮,因?yàn)楣俜轿臋n中沒(méi)有告訴我們要注意發(fā)生強(qiáng)引用,所以推測(cè)系統(tǒng)控件一般沒(méi)有對(duì)這些block進(jìn)行強(qiáng)引用,所以我們可以不用考慮循環(huán)強(qiáng)引用的問(wèn)題

[※※]GCD的隊(duì)列(dispatch_queue_t)分哪兩種類型?

  串行隊(duì)列和并行隊(duì)列

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

  總體上說(shuō):  使用 dispatch group,然后 wait forever 等待完成, 或者采取 group notify 來(lái)通知回調(diào)。
  細(xì)節(jié):
  1. 創(chuàng)建異步隊(duì)列
  2. 創(chuàng)建dispatch_group  dispatch_group_t =  dispatch_group_create()
  3. 通過(guò)組來(lái)執(zhí)行異步下載任務(wù)
    dispatch_group_async(queueGroup, aQueue, ^{    
          NSLog(@"下載圖片.");    
    }); 
  4.等到所有任務(wù)完成   dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
  5.合成圖片

[※※※※]dispatch_barrier_async的作用是什么?

barrier:是障礙物的意思,在多個(gè)并行任務(wù)中間,他就像是一個(gè)隔離帶,把前后的并行任務(wù)分開(kāi).
dispatch_barrier_async 作用是在并行隊(duì)列中,等待前面操作并行任務(wù)完成再執(zhí)行dispatch_barrier_async中的任務(wù),如果后面還有并行任務(wù),會(huì)開(kāi)始執(zhí)行后續(xù)的并行任務(wù)
[※※※※※]蘋(píng)果為什么要廢棄dispatch_get_current_queue?
容易誤用造成死鎖

[※※※※※]以下代碼運(yùn)行結(jié)果如何?

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
}
  1. 只能輸出1,然后線程主線程死鎖

[※※]addObserver:forKeyPath:options:context:各個(gè)參數(shù)的作用分別是什么,observer中需要實(shí)現(xiàn)哪個(gè)方法才能獲得KVO回調(diào)?

   // 添加鍵值觀察
    /**
     1. 調(diào)用對(duì)象:要監(jiān)聽(tīng)的對(duì)象
     2. 參數(shù)
     1> 觀察者,負(fù)責(zé)處理監(jiān)聽(tīng)事件的對(duì)象
     2> 觀察的屬性
     3> 觀察的選項(xiàng)
     4> 上下文
     */
    [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];
 // NSObject 分類方法,意味著所有的 NSObject 都可以實(shí)現(xiàn)這個(gè)方法!
// 跟協(xié)議的方法很像,分類方法又可以稱為“隱式代理”!不提倡用,但是要知道概念!
// 所有的 kvo 監(jiān)聽(tīng)到事件,都會(huì)調(diào)用此方法
/**
 1. 觀察的屬性
 2. 觀察的對(duì)象
 3. change 屬性變化字典(新/舊)
 4. 上下文,與監(jiān)聽(tīng)的時(shí)候傳遞的一致
 
 可以利用上下文區(qū)分不同的監(jiān)聽(tīng)!
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    NSLog(@"睡會(huì) %@", [NSThread currentThread]);
    
    [NSThread sleepForTimeInterval:1.0];
    
    NSLog(@"%@ %@ %@ %@", keyPath, object, change, context);
}   

[※※※]如何手動(dòng)觸發(fā)一個(gè)value的KVO

1.通過(guò)setValue:forKey: 給屬性賦值
2.通過(guò)setValue:forKeyPath: 給屬性賦值
3.直接調(diào)用setter方法方法給屬性賦值
4.直接通過(guò)指針給屬性賦值
5.

給這個(gè)value設(shè)置一個(gè)值,就可以觸發(fā)了

[※※※]若一個(gè)類有實(shí)例變量NSString *_foo,調(diào)用setValue:forKey:時(shí),可以以foo還是_foo作為key?

 都可以

[※※※※]KVC的keyPath中的集合運(yùn)算符如何使用?

1. 必須用在集合對(duì)象上或普通對(duì)象的集合屬性上
2. 簡(jiǎn)單集合運(yùn)算符有@avg, @count , @max , @min ,@sum,
3. 格式  @"@sum.age"或 @"集合屬性.@max.age"  

[※※※※]KVC和KVO的keyPath一定是屬性么?

1.一個(gè)可以是成員變量

[※※※※※]如何關(guān)閉默認(rèn)的KVO的默認(rèn)實(shí)現(xiàn),并進(jìn)入自定義的KVO實(shí)現(xiàn)?

如何自己動(dòng)手實(shí)現(xiàn) KVO

[※※※※※]apple用什么方式實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的KVO?

 同上

[※※]IBOutlet連出來(lái)的視圖屬性為什么可以被設(shè)置成weak?

因?yàn)橐晥D已經(jīng)對(duì)它有一個(gè)強(qiáng)引用了

[※※※※※]IB中User Defined Runtime Attributes如何使用?

    User Defined Runtime Attributes 是一個(gè)不被看重但功能非常強(qiáng)大的的特性,
    它能夠通過(guò)KVC的方式配置一些你在interface builder 中不能配置的屬性。當(dāng)你希望在IB中作盡可能多得事情,
    這個(gè)特性能夠幫助你編寫(xiě)更加輕量級(jí)的viewcontroller

[※※※]如何調(diào)試BAD_ACCESS錯(cuò)誤

 1.設(shè)置全局?jǐn)帱c(diǎn)快速定位問(wèn)題代碼所在行

[※※※]lldb(gdb)常用的調(diào)試命令?

 最常用就是 : po 對(duì)象

其他的參照 淺談LLDB調(diào)試器

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

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

  • 出題者簡(jiǎn)介: 孫源(sunnyxx),目前就職于百度,負(fù)責(zé)百度知道 iOS 客戶端的開(kāi)發(fā)工作,對(duì)技術(shù)喜歡刨根問(wèn)底和...
    戈多_于勒閱讀 1,884評(píng)論 0 5
  • 你的價(jià)值等于你所解決問(wèn)題的價(jià)值。 什么是問(wèn)題? 問(wèn)題就是現(xiàn)狀與目標(biāo)的差異。而解決問(wèn)題的目的實(shí)際上就是要讓目標(biāo)實(shí)現(xiàn)。...
    Andy0222閱讀 1,606評(píng)論 1 3
  • 不同類型的專題,其設(shè)計(jì)制作流程也有一定區(qū)別,例如電商類在業(yè)務(wù)需求和業(yè)務(wù)目標(biāo)方面較重,而新聞?lì)惖膭t側(cè)重選題和內(nèi)容,本...
    Dirac閱讀 2,378評(píng)論 0 49
  • 秋風(fēng)勁,秋月沉,縷縷黃葉落庭門(mén)。凄然,無(wú)奈時(shí)光易流轉(zhuǎn)。況此殘燈夜,獨(dú)宿倍覺(jué)寒;歲曉千萬(wàn)慮,并入方寸心。夜永對(duì)景,那...
    AiccGYG閱讀 362評(píng)論 0 1
  • tips: 第一部分 知識(shí)點(diǎn)預(yù)習(xí)或復(fù)習(xí) 1. 知識(shí)點(diǎn)清單: 1)對(duì)象、數(shù)據(jù)、方法 2)添加控件:Label、But...
    遺忘艷陽(yáng)天閱讀 273評(píng)論 0 0

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