對(duì)block理解 言缤?
block對(duì)變量的賦值
static CGFloat tmp3;
@implementation ViewController
- (void)func {
__block CGFloat tmp1 ;
__block CGFloat tmp2 ;
void(^block)(void) = ^void(){
tmp1 = 30;
tmp2 = 40;
tmp3 = 50;
};
block();
}
@end
對(duì)@property屬性里面修飾符的理解陨享?
1.原子性--- nonatomic 特質(zhì)
2.讀/寫權(quán)限---readwrite(讀寫)诅需、readonly (只讀)
3.內(nèi)存管理語義---assign渔呵、strong责掏、 weak馏段、unsafe_unretained轩拨、copy
4.方法名---getter=<name> 、setter=<name>
5.不常用的:nonnull,null_resettable,nullable
1). readwrite 是可讀可寫特性院喜。需要生成getter方法和setter方法亡蓉。
2). readonly 是只讀特性。只會(huì)生成getter方法喷舀,不會(huì)生成setter方法砍濒,不希望屬性在類外改變淋肾。
3). assign 是賦值特性。setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí),assign用于基本數(shù)據(jù)類型
爸邢。
4). retain(MRC)/strong(ARC) 表示持有特性樊卓。setter方法將傳入?yún)?shù)先保留,再賦值杠河,傳入?yún)?shù)的retaincount會(huì)+1
碌尔。
5). copy 表示拷貝特性。setter方法將傳入對(duì)象復(fù)制一份
券敌,需要完全一份新的變量時(shí)唾戚。
6). nonatomic 非原子操作。決定編譯器生成的setter和getter方法是否是原子操作待诅,atomic表示多線程安全颈走,一般使用nonatomic,效率高咱士。
#import
立由、#include
、@class
有什么區(qū)別序厉?
#import
是Objective-C導(dǎo)入頭文件的關(guān)鍵字锐膜,使用#import
頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入弛房。
#include
是C/C++導(dǎo)入頭文件的關(guān)鍵字道盏。
@class
告訴編譯器某個(gè)類的聲明,當(dāng)執(zhí)行時(shí)文捶,才去查看類的實(shí)現(xiàn)文件荷逞,可以解決頭文件的相互包含。
KVO實(shí)現(xiàn)原理粹排?
KVO基本原理:
1.KVO是基于runtime機(jī)制實(shí)現(xiàn)的种远。
2.當(dāng)某個(gè)類的屬性對(duì)象第一次被觀察時(shí),系統(tǒng)就會(huì)在運(yùn)行期動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類顽耳,在這個(gè)派生類中重寫基類中任何被觀察屬性的setter 方法坠敷。派生類在被重寫的setter方法內(nèi)實(shí)現(xiàn)真正的通知機(jī)制。
3.如果原類為Person射富,那么生成的派生類名為NSKVONotifying_Person膝迎。
4.每個(gè)類對(duì)象中都有一個(gè)isa指針指向當(dāng)前類,當(dāng)一個(gè)類對(duì)象的第一次被觀察胰耗,那么系統(tǒng)會(huì)偷偷將isa指針指向動(dòng)態(tài)生成的派生類限次,從而在給被監(jiān)控屬性賦值時(shí)執(zhí)行的是派生類的setter方法。
5.鍵值觀察通知依賴于NSObject 的兩個(gè)方法: willChangeValueForKey: 和 didChangevlueForKey:柴灯;在一個(gè)被觀察屬性發(fā)生改變之前卖漫, willChangeValueForKey:一定會(huì)被調(diào)用费尽,這就 會(huì)記錄舊的值。而當(dāng)改變發(fā)生后懊亡,didChangeValueForKey:會(huì)被調(diào)用依啰,繼而 observeValueForKey:ofObject:change:context: 也會(huì)被調(diào)用乎串。
KVO深入原理:
1.Apple 使用了 isa 混寫(isa-swizzling)來實(shí)現(xiàn) KVO 店枣。當(dāng)觀察對(duì)象A時(shí),KVO機(jī)制動(dòng)態(tài)創(chuàng)建一個(gè)新的名為:?NSKVONotifying_A的新類叹誉,該類繼承自對(duì)象A的本類鸯两,且KVO為NSKVONotifying_A重寫觀察屬性的setter?方法,setter?方法會(huì)負(fù)責(zé)在調(diào)用原?setter?方法之前和之后长豁,通知所有觀察對(duì)象屬性值的更改情況钧唐。
2.NSKVONotifying_A類剖析:在這個(gè)過程,被觀察對(duì)象的 isa 指針從指向原來的A類匠襟,被KVO機(jī)制修改為指向系統(tǒng)新創(chuàng)建的子類 NSKVONotifying_A類钝侠,來實(shí)現(xiàn)當(dāng)前類屬性值改變的監(jiān)聽;
3.所以當(dāng)我們從應(yīng)用層面上看來酸舍,完全沒有意識(shí)到有新的類出現(xiàn)帅韧,這是系統(tǒng)“隱瞞”了對(duì)KVO的底層實(shí)現(xiàn)過程,讓我們誤以為還是原來的類啃勉。但是此時(shí)如果我們創(chuàng)建一個(gè)新的名為“NSKVONotifying_A”的類()忽舟,就會(huì)發(fā)現(xiàn)系統(tǒng)運(yùn)行到注冊(cè)KVO的那段代碼時(shí)程序就崩潰,因?yàn)橄到y(tǒng)在注冊(cè)監(jiān)聽的時(shí)候動(dòng)態(tài)創(chuàng)建了名為NSKVONotifying_A的中間類淮阐,并指向這個(gè)中間類了叮阅。
4.(isa 指針的作用:每個(gè)對(duì)象都有isa 指針,指向該對(duì)象的類泣特,它告訴 Runtime 系統(tǒng)這個(gè)對(duì)象的類是什么浩姥。所以對(duì)象注冊(cè)為觀察者時(shí),isa指針指向新子類状您,那么這個(gè)被觀察的對(duì)象就神奇地變成新子類的對(duì)象(或?qū)嵗┝思翱獭#?因而在該對(duì)象上對(duì) setter 的調(diào)用就會(huì)調(diào)用已重寫的 setter,從而激活鍵值通知機(jī)制竞阐。
5.子類setter方法剖析:KVO的鍵值觀察通知依賴于 NSObject 的兩個(gè)方法:willChangeValueForKey:和 didChangevlueForKey:缴饭,在存取數(shù)值的前后分別調(diào)用2個(gè)方法: 被觀察屬性發(fā)生改變之前,willChangeValueForKey:被調(diào)用骆莹,通知系統(tǒng)該 keyPath?的屬性值即將變更颗搂;當(dāng)改變發(fā)生后, didChangeValueForKey: 被調(diào)用幕垦,通知系統(tǒng)該 keyPath?的屬性值已經(jīng)變更丢氢;之后傅联,?observeValueForKey:ofObject:change:context: 也會(huì)被調(diào)用。且重寫觀察屬性的setter?方法這種繼承方式的注入是在運(yùn)行時(shí)而不是編譯時(shí)實(shí)現(xiàn)的疚察。
對(duì)業(yè)務(wù)埋點(diǎn)的理解蒸走?
iOS無埋點(diǎn)數(shù)據(jù)SDK實(shí)踐之路
iOS無埋點(diǎn)數(shù)據(jù)SDK的整體設(shè)計(jì)與技術(shù)實(shí)現(xiàn)
iOS無埋點(diǎn)SDK 之 RN頁面的數(shù)據(jù)收集
項(xiàng)目組件化理解?
- 為什么用組件化貌嫡?
- 組件化架構(gòu)設(shè)計(jì)比驻?
- 組件化需要考慮到哪些影響因素?