iOS面試題上

面試題上

  1. 什么情況使用 weak 關(guān)鍵字捻撑,相比 assign 有什么不同?

    • 什么情況使用 weak 關(guān)鍵字缤底?
      1. 在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用 weak 來(lái)解決,比如: delegate 代理屬性
      2. 自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak顾患;當(dāng)然,也可以使用strong梧田。
    • 不同點(diǎn):
      1. 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)單賦值操作画恰。
      2. assigin 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象
  2. 怎么用 copy 關(guān)鍵字彭谁?

    • 用途:
      1. NSString、NSArray允扇、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字缠局,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray考润、NSMutableDictionary狭园;
      2. 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)用之前自行拷貝屬性值绎谦。這種操作多余而低效.
      3. 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í)拷貝一份咸灿。

  3. 這個(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ì)讀到不同的屬性值碍庵。
  1. 如何讓自己的類用 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” 方法富稻。

  2. @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è)類中的?
      1. “自動(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í)例變量的名字.
  3. @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
    
  4. 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。
  5. @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
  6. 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)裸诽。
  7. @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)綁定。
  1. 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
  2. 用@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
)
```



  1. 什么情況下不會(huì)autosynthesis(自動(dòng)合成)敦间?

    • 同時(shí)重寫了 setter 和 getter 時(shí)
    • 重寫了只讀屬性的 getter 時(shí)
    • 使用了 @dynamic 時(shí)
    • 在 @protocol 中定義的所有屬性
    • 在 category 中定義的所有屬性
    • 重載的屬性:當(dāng)你在子類中重載了父類中的屬性,你必須 使用 @synthesize 來(lái)手動(dòng)合成ivar束铭。
  2. 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ò)誤旋奢。
  3. 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));至朗。
  4. 什么時(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ì):
      1. 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)
      2. 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)恶迈。
      3. 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ì)象辆床。
  5. 一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局佳晶?(考慮有父類的情況)

    • 所有父類的成員變量和自己的成員變量都會(huì)存放在該對(duì)象所對(duì)應(yīng)的存儲(chǔ)空間中.
    • 每一個(gè)對(duì)象內(nèi)部都有一個(gè)isa指針,指向他的類對(duì)象,類對(duì)象中存放著本對(duì)象的
      1. 對(duì)象方法列表(對(duì)象能夠接收的消息列表,保存在它所對(duì)應(yīng)的類對(duì)象中)
      2. 成員變量的列表,
      3. 屬性列表,

      它內(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類凸克。


  6. 一個(gè)objc對(duì)象的isa的指針指向什么议蟆?有什么作用?

    • 指向他的類對(duì)象,從而可以找到對(duì)象上的方法
  7. 下面的代碼輸出什么萎战?

    @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題沒整明白.......

  1. 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).
  2. 使用runtime Associate方法關(guān)聯(lián)的對(duì)象舔清,需要在主對(duì)象dealloc的時(shí)候釋放么丝里?

  3. 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》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杯聚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抒痒,更是在濱河造成了極大的恐慌幌绍,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故响,死亡現(xiàn)場(chǎng)離奇詭異傀广,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)彩届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門伪冰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人樟蠕,你說(shuō)我怎么就攤上這事贮聂。” “怎么了寨辩?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵吓懈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捣染,道長(zhǎng)骄瓣,這世上最難降的妖魔是什么停巷? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任耍攘,我火速辦了婚禮,結(jié)果婚禮上畔勤,老公的妹妹穿的比我還像新娘蕾各。我一直安慰自己,他們只是感情好庆揪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布式曲。 她就那樣靜靜地躺著,像睡著了一般缸榛。 火紅的嫁衣襯著肌膚如雪吝羞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天内颗,我揣著相機(jī)與錄音钧排,去河邊找鬼。 笑死均澳,一個(gè)胖子當(dāng)著我的面吹牛恨溜,可吹牛的內(nèi)容都是我干的符衔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼糟袁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼判族!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起项戴,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤形帮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后周叮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沃缘,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年则吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槐臀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氓仲,死狀恐怖水慨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敬扛,我是刑警寧澤晰洒,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站啥箭,受9級(jí)特大地震影響谍珊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜急侥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一砌滞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坏怪,春花似錦贝润、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鹏秋,卻和暖如春尊蚁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侣夷。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工横朋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惜纸。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓叶撒,卻偏偏與公主長(zhǎng)得像绝骚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祠够,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • 出題者簡(jiǎn)介: 孫源(sunnyxx)压汪,目前就職于百度,負(fù)責(zé)百度知道 iOS 客戶端的開發(fā)工作古瓤,對(duì)技術(shù)喜歡刨根問(wèn)底和...
    戈多_于勒閱讀 1,790評(píng)論 0 5
  • 這兩天有點(diǎn)忙止剖,沒寫日記。更主要的是因?yàn)樽约河窒萑肓怂姥h(huán)落君,無(wú)法自拔穿香。 女兒這個(gè)月沒有暑假課要上了,每天的作業(yè)量也不...
    勿忘我瑤閱讀 128評(píng)論 6 2
  • 人有很多種:自信绎速,自卑皮获,樂觀,悲觀纹冤,積極洒宝,頹廢……我們身邊的人都是各種性格的復(fù)合體,接觸時(shí)感覺各不相同萌京,耿直雁歌,古怪...
    你睡了閱讀 229評(píng)論 0 0
  • 納木錯(cuò)
    ZHANG_海灣閱讀 113評(píng)論 0 0