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è)寫法會(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

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

  • 重寫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方法方法中從偏移量的位置開始賦值,在getter方法中從偏移量開始取值,為了能夠讀取正確字節(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)歷上找自己寫擅長(zhǎng)的技術(shù)聊癞尚,假如自己并不是很熟,最好別寫出來(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)寫蝶缀,那么默認(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è)名為_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)景嗎? 能給我介紹一下嗎?
如果你聽懂了,感覺(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)是開啟的,其他線程的runloop是默認(rèn)沒(méi)有開啟的
 2. 可以通過(guò)CFRunLoopRun() 函數(shù)來(lái)開啟一個(gè)事件循環(huán)
 3. 看SDWebImage源碼的時(shí)候見到有這么用過(guò).

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

model 主要是用來(lái)指定時(shí)間在運(yùn)行循環(huán)中的優(yōu)先級(jí)的
蘋果公開提供的 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),開始執(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ò)什么方式幫助開發(fā)者管理內(nèi)存衫嵌?

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

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

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

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

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

[※※※※※]蘋果是如何實(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版本寫動(dòng)畫時(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ù)分開.
dispatch_barrier_async 作用是在并行隊(duì)列中,等待前面操作并行任務(wù)完成再執(zhí)行dispatch_barrier_async中的任務(wù),如果后面還有并行任務(wù),會(huì)開始執(zhí)行后續(xù)的并行任務(wù)
[※※※※※]蘋果為什么要廢棄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)聽的對(duì)象
     2. 參數(shù)
     1> 觀察者匪凡,負(fù)責(zé)處理監(jiān)聽事件的對(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)聽到事件买猖,都會(huì)調(diào)用此方法
/**
 1. 觀察的屬性
 2. 觀察的對(duì)象
 3. change 屬性變化字典(新/舊)
 4. 上下文,與監(jiān)聽的時(shí)候傳遞的一致
 
 可以利用上下文區(qū)分不同的監(jiān)聽滋尉!
 */
- (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è)特性能夠幫助你編寫更加輕量級(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)系作者
  • 序言:七十年代末滩租,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子利朵,更是在濱河造成了極大的恐慌律想,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍弟,死亡現(xiàn)場(chǎng)離奇詭異技即,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)樟遣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門而叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)身笤,“玉大人,你說(shuō)我怎么就攤上這事葵陵∫狠” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脱篙,是天一觀的道長(zhǎng)娇钱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)绊困,這世上最難降的妖魔是什么文搂? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮秤朗,結(jié)果婚禮上煤蹭,老公的妹妹穿的比我還像新娘。我一直安慰自己取视,他們只是感情好疯兼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贫途,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待侵。 梳的紋絲不亂的頭發(fā)上丢早,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音秧倾,去河邊找鬼怨酝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛那先,可吹牛的內(nèi)容都是我干的农猬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼售淡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斤葱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起揖闸,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揍堕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后汤纸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衩茸,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年贮泞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楞慈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔烛。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖囊蓝,靈堂內(nèi)的尸體忽然破棺而出饿悬,到底是詐尸還是另有隱情,我是刑警寧澤慎颗,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布乡恕,位于F島的核電站,受9級(jí)特大地震影響俯萎,放射性物質(zhì)發(fā)生泄漏傲宜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一夫啊、第九天 我趴在偏房一處隱蔽的房頂上張望函卒。 院中可真熱鬧,春花似錦撇眯、人聲如沸报嵌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锚国。三九已至,卻和暖如春玄坦,著一層夾襖步出監(jiān)牢的瞬間血筑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工煎楣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豺总,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓择懂,卻偏偏與公主長(zhǎng)得像喻喳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子困曙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 出題者簡(jiǎn)介: 孫源(sunnyxx)表伦,目前就職于百度,負(fù)責(zé)百度知道 iOS 客戶端的開發(fā)工作赂弓,對(duì)技術(shù)喜歡刨根問(wèn)底和...
    戈多_于勒閱讀 1,798評(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,483評(píng)論 1 3
  • 不同類型的專題赤套,其設(shè)計(jì)制作流程也有一定區(qū)別飘痛,例如電商類在業(yè)務(wù)需求和業(yè)務(wù)目標(biāo)方面較重,而新聞?lì)惖膭t側(cè)重選題和內(nèi)容容握,本...
    Dirac閱讀 2,300評(píng)論 0 49
  • 秋風(fēng)勁宣脉,秋月沉,縷縷黃葉落庭門剔氏。凄然塑猖,無(wú)奈時(shí)光易流轉(zhuǎn)。況此殘燈夜谈跛,獨(dú)宿倍覺(jué)寒羊苟;歲曉千萬(wàn)慮,并入方寸心感憾。夜永對(duì)景蜡励,那...
    AiccGYG閱讀 328評(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)天閱讀 214評(píng)論 0 0