一個(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
- 在protocol中使用property只會(huì)生成setter和getter方法聲明,我們使用屬性的目的,是希望遵守我協(xié)議的對(duì)象的實(shí)現(xiàn)該屬性
- category 使用 @property 也是只會(huì)生成setter和getter方法的聲明,如果我們真的需要給category增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行時(shí)的兩個(gè)函數(shù)
- objc_setAssociatedObject
- 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分別有什么作用?
- @property有兩個(gè)對(duì)應(yīng)的詞蹬跃,一個(gè)是@synthesize匙瘪,一個(gè)是@dynamic。如果@synthesize和@dynamic都沒(méi)寫蝶缀,那么默認(rèn)的就是@syntheszie var = _var;
- @synthesize的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn)setter方法和getter方法丹喻,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法。
- @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)鍵字都有哪些消略?
- 對(duì)應(yīng)基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字是
atomic,readwrite,assign - 對(duì)于普通的OC對(duì)象
atomic,readwrite,strong
[※※※]用@property聲明的NSString(或NSArray堡称,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么艺演?如果改用strong關(guān)鍵字却紧,可能造成什么問(wèn)題桐臊?
- 因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用copy的目的是為了讓本對(duì)象的屬性不受外界影響,使用copy無(wú)論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本.
- 如果我們使用是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ā)生什么?
- 在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ā)生什么茅主?
- 沒(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外部變量桦锄?
- 通過(guò) __bock修改的外部變量,可以在block內(nèi)部修改
- 想裝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,然后線程主線程死鎖
[※※]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)穆律?
[※※※※※]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)試器