面試題上
-
什么情況使用 weak 關(guān)鍵字捻撑,相比 assign 有什么不同?
- 什么情況使用 weak 關(guān)鍵字缤底?
- 在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用 weak 來(lái)解決,比如: delegate 代理屬性
- 自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak顾患;當(dāng)然,也可以使用strong梧田。
- 不同點(diǎn):
- weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)潮酒。為這種屬性設(shè)置新值時(shí)贤牛,設(shè)置方法既不保留新值,也不釋放舊值犁河。此特質(zhì)同assign類似, 然而在屬性所指的對(duì)象遭到摧毀時(shí)魄梯,屬性值也會(huì)清空(nil out)桨螺。 而 assign 的“設(shè)置方法”只會(huì)執(zhí)行針對(duì)“純量類型” (scalar type,例如 CGFloat 或 NSlnteger 等)的簡(jiǎn)單賦值操作画恰。
- assigin 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象
- 什么情況使用 weak 關(guān)鍵字缤底?
-
怎么用 copy 關(guān)鍵字彭谁?
- 用途:
- NSString、NSArray允扇、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字缠局,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray考润、NSMutableDictionary狭园;
- block 也經(jīng)常使用 copy 關(guān)鍵字.block 使用 copy 是從 MRC 遺留下來(lái)的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫不寫都行:對(duì)于 block 使用 copy 還是strong效果是一樣的,但寫上copy也無(wú)傷大雅糊治,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì)block進(jìn)行了copy操作唱矛。如果不寫copy,該類的調(diào)用者有可能會(huì)忘記或者根本不知道“編譯器會(huì)自動(dòng)對(duì)block進(jìn)行了copy操作”井辜,他們有可能會(huì)在調(diào)用之前自行拷貝屬性值绎谦。這種操作多余而低效.
- copy 此特質(zhì)所表達(dá)的所屬關(guān)系與 strong 類似。然而設(shè)置方法并不保留新值粥脚,而是將其“拷貝” (copy)窃肠。 當(dāng)屬性類型為 NSString 時(shí),經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性刷允,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè) NSMutableString 類的實(shí)例冤留。這個(gè)類是 NSString 的子類碧囊,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串纤怒,那么設(shè)置完屬性之后糯而,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以泊窘,這時(shí)就要拷貝一份“不可變” (immutable)的字符串熄驼,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable)烘豹,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份谜洽。
用 @property 聲明 NSString、NSArray吴叶、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字阐虚,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray蚌卤、NSMutableDictionary实束,他們之間可能進(jìn)行賦值操作,為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)逊彭,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份咸灿。
- 用途:
-
這個(gè)寫法會(huì)出什么問(wèn)題:
@property (copy) NSMutableArray *array;
- 添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰.因?yàn)?copy 就是復(fù)制一個(gè)不可變 NSArray 的對(duì)象;例如:
// 定義屬性 @property (nonatomic, copy) NSMutableArray *mutableArray; NSMutableArray *array = [NSMutableArray arrayWithObjects:@1,@2,nil];
self.mutableArray = array;
[self.mutableArray removeObjectAtIndex:0];
// 崩潰信息
-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
```
- 使用了 atomic 屬性會(huì)嚴(yán)重影響性能 侮叮;
1. 該屬性使用了同步鎖避矢,會(huì)在創(chuàng)建時(shí)生成一些額外的代碼用于幫助編寫多線程程序,這會(huì)帶來(lái)性能問(wèn)題囊榜,通過(guò)聲明 nonatomic 可以節(jié)省這些雖然很小但是不必要額外開銷
2. 一般情況下并不要求屬性必須是“原子的”审胸,因?yàn)檫@并不能保證“線程安全” ( thread safety),若要實(shí)現(xiàn)“線程安全”的操作卸勺,還需采用更為深層的鎖定機(jī)制才行砂沛。
3. `這條回答了:使用atomic一定安全嗎?`一個(gè)線程在連續(xù)多次讀取某屬性值的過(guò)程中有別的線程在同時(shí)改寫該值,那么即便將屬性聲明為 atomic曙求,也還是會(huì)讀到不同的屬性值碍庵。
-
如何讓自己的類用 copy 修飾符?如何重寫帶 copy 關(guān)鍵字的 setter悟狱?
若想令自己所寫的對(duì)象具有拷貝功能静浴,則需實(shí)現(xiàn) NSCopying 協(xié)議。如果自定義的對(duì)象分為可變版本與不可變版本挤渐,那么就要同時(shí)實(shí)現(xiàn) NSCopying 與 NSMutableCopying 協(xié)議
- 具體步驟:
1. 需聲明該類遵從 NSCopying 協(xié)議
2. 實(shí)現(xiàn) NSCopying 協(xié)議苹享。該協(xié)議只有一個(gè)方法
objc - (id)copyWithZone:(NSZone *)zone;
- 注意:一提到讓自己的類用 copy 修飾符,我們總是想覆寫copy方法挣菲,其實(shí)真正需要實(shí)現(xiàn)的卻是 “copyWithZone” 方法富稻。 -
@property 的本質(zhì)是什么?ivar白胀、getter椭赋、setter 是如何生成并添加到這個(gè)類中的?
- @property 的本質(zhì)是什么?
// “屬性” (property)有兩大概念:ivar(實(shí)例變量)或杠、存取方法(access method = getter + setter)哪怔。 @property = ivar + getter + setter;
- “屬性” (property)作為 Objective-C 的一項(xiàng)特性,主要的作用就在于封裝對(duì)象中的數(shù)據(jù)向抢。 Objective-C 對(duì)象通常會(huì)把其所需要的數(shù)據(jù)保存為各種實(shí)例變量认境。實(shí)例變量一般通過(guò)“存取方法”(access method)來(lái)訪問(wèn)。其中挟鸠,“獲取方法” (getter)用于讀取變量值叉信,而“設(shè)置方法” (setter)用于寫入變量值。這個(gè)概念已經(jīng)定型艘希,并且經(jīng)由“屬性”這一特性而成為 Objective-C 2.0 的一部分硼身。 而在正規(guī)的 Objective-C 編碼風(fēng)格中,存取方法有著嚴(yán)格的命名規(guī)范覆享。 正因?yàn)橛辛诉@種嚴(yán)格的命名規(guī)范佳遂,所以 Objective-C 這門語(yǔ)言才能根據(jù)名稱自動(dòng)創(chuàng)建出存取方法。其實(shí)也可以把屬性當(dāng)做一種關(guān)鍵字撒顿,其表示:
// 編譯器會(huì)自動(dòng)寫出一套存取方法丑罪,用以訪問(wèn)給定類型中具有給定名稱的變量。 所以你也可以這么說(shuō): @property = getter + setter;
- ivar凤壁、getter吩屹、setter 是如何生成并添加到這個(gè)類中的?
-
“自動(dòng)合成”( autosynthesis)
完成屬性定義后,編譯器會(huì)自動(dòng)編寫訪問(wèn)這些屬性所需的方法拧抖,此過(guò)程叫做“自動(dòng)合成”(autosynthesis)祟峦。需要強(qiáng)調(diào)的是,這個(gè)過(guò)程由編譯 器在編譯期執(zhí)行徙鱼,所以編輯器里看不到這些“合成方法”(synthesized method)的源代碼宅楞。除了生成方法代碼 getter、setter 之外袱吆,編譯器還要自動(dòng)向類中添加適當(dāng)類型的實(shí)例變量厌衙,并且在屬性名前面加下劃線,以此作為實(shí)例變量的名字绞绒。也可以在類的實(shí)現(xiàn)代碼里通過(guò) @synthesize 語(yǔ)法來(lái)指定實(shí)例變量的名字.
-
-
@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 屬性?
- weak 屬性的特點(diǎn):
- weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)婶希。為這種屬性設(shè)置新值時(shí),設(shè)置方法既不保留新值蓬衡,也不釋放舊值喻杈。此特質(zhì)同 assign 類似彤枢, 然而在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)筒饰。
- runtime 如何實(shí)現(xiàn) weak 變量的自動(dòng)置nil缴啡?
- runtime 對(duì)注冊(cè)的類, 會(huì)進(jìn)行布局瓷们,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中业栅。 用 weak 指向的對(duì)象內(nèi)存地址作為 key,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì) dealloc谬晕,假如 weak 指向的對(duì)象內(nèi)存地址是a碘裕,那么就會(huì)以a為鍵, 在這個(gè) weak 表中搜索攒钳,找到所有以a為鍵的 weak 對(duì)象帮孔,從而設(shè)置為 nil。
- weak 屬性的特點(diǎn):
-
@property中有哪些屬性關(guān)鍵字不撑?/ @property 后面可以有哪些修飾符你弦?
- 屬性可以擁有的特質(zhì)分為四類:
- 原子性--- nonatomic 特質(zhì)
- 在默認(rèn)情況下,由編譯器合成的方法會(huì)通過(guò)鎖定機(jī)制確保其原子性(atomicity)燎孟。如果屬性具備 nonatomic 特質(zhì)禽作,則不使用同步鎖。請(qǐng)注意揩页,盡管沒有名為“atomic”的特質(zhì)(如果某屬性不具備 nonatomic 特質(zhì)旷偿,那它就是“原子的” ( atomic) ),但是仍然可以在屬性特質(zhì)中寫明這一點(diǎn)爆侣,編譯器不會(huì)報(bào)錯(cuò)萍程。若是自己定義存取方法,那么就應(yīng)該遵從與屬性特質(zhì)相符的原子性兔仰。
- 讀/寫權(quán)限---readwrite(讀寫)茫负、readonly (只讀)
- 內(nèi)存管理語(yǔ)義---assign、strong乎赴、 weak忍法、unsafe_unretained、copy
- 方法名---getter=<name> 榕吼、setter=<name>
- getter=<name>的樣式:
@property (nonatomic, getter=isOn) BOOL on;
- setter=<name>一般用在特殊的情境下饿序,比如:
在數(shù)據(jù)反序列化、轉(zhuǎn)模型的過(guò)程中羹蚣,服務(wù)器返回的字段如果以 init 開頭原探,所以你需要定義一個(gè) init 開頭的屬性,但默認(rèn)生成的 setter 與 getter 方法也會(huì)以 init 開頭,而編譯器會(huì)把所有以 init 開頭的方法當(dāng)成初始化方法咽弦,而初始化方法只能返回 self 類型徒蟆,因此編譯器會(huì)報(bào)錯(cuò)。這時(shí)你就可以使用下面的方式來(lái)避免編譯器報(bào)錯(cuò):
@property(nonatomic, strong, getter=p_initBy, setter=setP_initBy:)NSString *initBy;
- 不常用的:nonnull,null_resettable,nullable
- 原子性--- nonatomic 特質(zhì)
- 屬性可以擁有的特質(zhì)分為四類:
-
weak屬性需要在dealloc中置nil么型型?
- 不需要段审。
- 在ARC環(huán)境無(wú)論是強(qiáng)指針還是弱指針都無(wú)需在 dealloc 設(shè)置為 nil , ARC 會(huì)自動(dòng)幫我們處理
- 即便是編譯器不幫我們做這些输莺,weak也不需要在 dealloc 中置nil:
- 在屬性所指的對(duì)象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)裸诽。
@synthesize和@dynamic分別有什么作用嫂用?
- @property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是 @synthesize丈冬,一個(gè)是 @dynamic嘱函。如果 @synthesize和 @dynamic都沒寫,那么默認(rèn)的就是@syntheszie var = _var;
- @synthesize 的語(yǔ)義是如果你沒有手動(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,然后你沒有提供 @setter方法和 @getter 方法喉童,編譯的時(shí)候沒問(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í)沒問(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ì)于普通的 Objective-C 對(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ì)影響該屬性.
- copy 此特質(zhì)所表達(dá)的所屬關(guān)系與 strong 類似。然而設(shè)置方法并不保留新值,而是將其“拷貝” (copy)咖祭。 當(dāng)屬性類型為 NSString 時(shí)掩宜,經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè) NSMutableString 類的實(shí)例么翰。這個(gè)類是 NSString 的子類牺汤,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串浩嫌,那么設(shè)置完屬性之后檐迟,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改。所以码耐,這時(shí)就要拷貝一份“不可變” (immutable)的字符串追迟,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable)骚腥,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份
// 定義一個(gè)以 strong 修飾的 array: @property (nonatomic ,readwrite, strong) NSArray *array; // 然后進(jìn)行下面的操作: NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; NSArray *array = @[ @1, @2, @3, @4 ]; self.array = mutableArray; [mutableArray removeAllObjects];; NSLog(@"%@",self.array); [mutableArray addObjectsFromArray:array]; self.array = [mutableArray copy]; [mutableArray removeAllObjects];; NSLog(@"%@",self.array); // 打印結(jié)果 2015-09-27 19:10:32.523 CYLArrayCopyDmo[10681:713670] (
)
2015-09-27 19:10:32.524 CYLArrayCopyDmo[10681:713670] (
1,
2,
3,
4
)
```
-
什么情況下不會(huì)autosynthesis(自動(dòng)合成)敦间?
- 同時(shí)重寫了 setter 和 getter 時(shí)
- 重寫了只讀屬性的 getter 時(shí)
- 使用了 @dynamic 時(shí)
- 在 @protocol 中定義的所有屬性
- 在 category 中定義的所有屬性
- 重載的屬性:當(dāng)你在子類中重載了父類中的屬性,你必須 使用 @synthesize 來(lái)手動(dòng)合成ivar束铭。
-
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ā)送消息時(shí)驾凶,runtime庫(kù)會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類牙甫,然后在該類中的方法列表以及其父類方法列表中尋找方法運(yùn)行,然后在發(fā)送消息的時(shí)候调违,objc_msgSend方法不會(huì)返回值窟哺,所謂的返回內(nèi)容都是具體調(diào)用時(shí)執(zhí)行的。 那么技肩,回到本題且轨,如果向一個(gè)nil對(duì)象發(fā)送消息,首先在尋找對(duì)象的isa指針時(shí)就是0地址返回了,所以不會(huì)出現(xiàn)任何錯(cuò)誤旋奢。
-
objc中向一個(gè)對(duì)象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系泳挥?
- [obj foo];在objc動(dòng)態(tài)編譯時(shí),會(huì)被轉(zhuǎn)意為:objc_msgSend(obj, @selector(foo));至朗。
-
什么時(shí)候會(huì)報(bào)unrecognized selector的異常屉符?
- 當(dāng)調(diào)用該對(duì)象上某個(gè)方法,而該對(duì)象上沒有實(shí)現(xiàn)這個(gè)方法的時(shí)候, 可以通過(guò)“消息轉(zhuǎn)發(fā)”進(jìn)行解決锹引。
- objc是動(dòng)態(tài)語(yǔ)言矗钟,每個(gè)方法在運(yùn)行時(shí)會(huì)被動(dòng)態(tài)轉(zhuǎn)為消息發(fā)送,即:objc_msgSend(receiver, selector)嫌变。
- objc在向一個(gè)對(duì)象發(fā)送消息時(shí)吨艇,runtime庫(kù)會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類,然后在該類中的方法列表以及其父類方法列表中尋找方法運(yùn)行初澎,如果秸应,在最頂層的父類中依然找不到相應(yīng)的方法時(shí)虑凛,程序在運(yùn)行時(shí)會(huì)掛掉并拋出異常unrecognized selector sent to XXX 碑宴。但是在這之前,objc的運(yùn)行時(shí)會(huì)給出三次拯救程序崩潰的機(jī)會(huì):
-
Method resolution
:objc運(yùn)行時(shí)會(huì)調(diào)用+resolveInstanceMethod:或者 +resolveClassMethod:桑谍,讓你有機(jī)會(huì)提供一個(gè)函數(shù)實(shí)現(xiàn)延柠。如果你添加了函數(shù),那運(yùn)行時(shí)系統(tǒng)就會(huì)重新啟動(dòng)一次消息發(fā)送的過(guò)程锣披,否則 贞间,運(yùn)行時(shí)就會(huì)移到下一步,消息轉(zhuǎn)發(fā)(Message Forwarding) -
Fast forwarding
如果目標(biāo)對(duì)象實(shí)現(xiàn)了-forwardingTargetForSelector:雹仿,Runtime 這時(shí)就會(huì)調(diào)用這個(gè)方法增热,給你把這個(gè)消息轉(zhuǎn)發(fā)給其他對(duì)象的機(jī)會(huì)。 只要這個(gè)方法返回的不是nil和self胧辽,整個(gè)消息發(fā)送的過(guò)程就會(huì)被重啟峻仇,當(dāng)然發(fā)送的對(duì)象會(huì)變成你返回的那個(gè)對(duì)象。否則邑商,就會(huì)繼續(xù)Normal Fowarding摄咆。 這里叫Fast,只是為了區(qū)別下一步的轉(zhuǎn)發(fā)機(jī)制人断。因?yàn)檫@一步不會(huì)創(chuàng)建任何新的對(duì)象吭从,但下一步轉(zhuǎn)發(fā)會(huì)創(chuàng)建一個(gè)NSInvocation對(duì)象,所以相對(duì)更快點(diǎn)恶迈。 -
Normal forwarding
這一步是Runtime最后一次給你挽救的機(jī)會(huì)涩金。首先它會(huì)發(fā)送-methodSignatureForSelector:消息獲得函數(shù)的參數(shù)和返回值類型。如果-methodSignatureForSelector:返回nil,Runtime則會(huì)發(fā)出-doesNotRecognizeSelector:消息鸭廷,程序這時(shí)也就掛掉了枣抱。如果返回了一個(gè)函數(shù)簽名,Runtime就會(huì)創(chuàng)建一個(gè)NSInvocation對(duì)象并發(fā)送-forwardInvocation:消息給目標(biāo)對(duì)象辆床。
-
-
一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局佳晶?(考慮有父類的情況)
- 所有父類的成員變量和自己的成員變量都會(huì)存放在該對(duì)象所對(duì)應(yīng)的存儲(chǔ)空間中.
- 每一個(gè)對(duì)象內(nèi)部都有一個(gè)isa指針,指向他的類對(duì)象,類對(duì)象中存放著本對(duì)象的
- 對(duì)象方法列表(對(duì)象能夠接收的消息列表,保存在它所對(duì)應(yīng)的類對(duì)象中)
- 成員變量的列表,
- 屬性列表,
它內(nèi)部也有一個(gè)isa指針指向元對(duì)象(meta class),元對(duì)象內(nèi)部存放的是類方法列表,類對(duì)象內(nèi)部還有一個(gè)superclass的指針,指向他的父類對(duì)象讼载。
- 每個(gè) Objective-C 對(duì)象都有相同的結(jié)構(gòu)轿秧,如下圖所示:
- 根對(duì)象就是NSobject,它的superclass指針指向nil
- 類對(duì)象既然稱為對(duì)象咨堤,那它也是一個(gè)實(shí)例菇篡。類對(duì)象中也有一個(gè)isa指針指向它的元類(meta class),即類對(duì)象是元類的實(shí)例一喘。元類內(nèi)部存放的是類方法列表驱还,根元類的isa指針指向自己,superclass指針指向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
- 都輸出 Son
NSStringFromClass([self class]) = Son
NSStringFromClass([super class]) = Son
```
- self 是類的隱藏參數(shù)咐容,指向當(dāng)前調(diào)用方法的這個(gè)類的實(shí)例
- 其實(shí) super 是一個(gè) Magic Keyword, 它本質(zhì)是一個(gè)編譯器標(biāo)示符蚂维,和 self 是指向的同一個(gè)消息接受者戳粒!他們兩個(gè)的不同點(diǎn)在于:super 會(huì)告訴編譯器,調(diào)用 class 這個(gè)方法時(shí)虫啥,要去父類的方法蔚约,而不是本類里的。
- 上面的例子不管調(diào)用[self class]還是[super class]涂籽,接受消息的對(duì)象都是當(dāng)前 Son *xxx 這個(gè)對(duì)象苹祟。
- 當(dāng)使用 self 調(diào)用方法時(shí),會(huì)從當(dāng)前類的方法列表中開始找又活,如果沒有苔咪,就從父類中再找;而當(dāng)使用 super 時(shí)柳骄,則從父類的方法列表中開始找团赏。然后調(diào)用父類的這個(gè)方法。
19題沒整明白.......
-
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í)候釋放么丝里?
- 無(wú)論在MRC下還是ARC下均不需要。
對(duì)象內(nèi)存的銷毀時(shí)間表
- 無(wú)論在MRC下還是ARC下均不需要。
-
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ò)類名)
- 類方法:
本文完全轉(zhuǎn)自@《招聘一個(gè)靠譜的 iOS》