iOS面試題(三)

1、Objective-C 中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么?

線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼,方法是performSelectorOnMainThread,如果想延時(shí)執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone:

2、為什么我們常見的delegate屬性都用是weak而不是retain/strong?

是為了防止delegate兩端產(chǎn)生不必要的循環(huán)引用。
@property (nonatomic, weak) id<UITableViewDelegate> delegate;

3、什么時(shí)候用delete,什么時(shí)候用Notification?

Delegate(委托模式):1對(duì)1的反向消息通知功能。
Notification(通知模式):只想要把消息發(fā)送出去,告知某些狀態(tài)的變化。但是并不關(guān)心誰想要知道這個(gè)。

4、你是否接觸過OC中的反射機(jī)制?簡(jiǎn)單聊一下概念和使用

1). class反射

  • 通過類名的字符串形式實(shí)例化對(duì)象。
Class class = NSClassFromString(@"student"); 
Student *stu = [[class alloc] init];
  • 將類名變?yōu)樽址?/li>
Class class =[Student class];
NSString *className = NSStringFromClass(class);

2). SEL的反射

  • 通過方法的字符串形式實(shí)例化方法。
SEL selector = NSSelectorFromString(@"setName");  
[stu performSelector:selector withObject:@"Mike"];
  • 將方法變成字符串
NSStringFromSelector(@selector*(setName:));

5、isa指針問題

isa:是一個(gè)Class 類型的指針. 每個(gè)實(shí)例對(duì)象有個(gè)isa的指針,他指向?qū)ο蟮念?而Class里也有個(gè)isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當(dāng)類方法被調(diào) 用時(shí),先會(huì)從本身查找類方法的實(shí)現(xiàn),如果沒有,元類會(huì)向他父類查找該方法。同時(shí)注意的是:元類(meteClass)也是類,它也是對(duì)象。元類也有isa指針,它的isa指針最終指向的是一個(gè)根元類(root meteClass)。根元類的isa指針指向本身,這樣形成了一個(gè)封閉的內(nèi)循環(huán)。

6、如何訪問并修改一個(gè)類的私有屬性?

1). 一種是通過KVC獲取。
2). 通過runtime訪問并修改私有屬性。

7、一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用?

指向他的類對(duì)象,從而可以找到對(duì)象上的方法。

8、怎么用 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 遺留下來的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫不寫都行:對(duì)于 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì) block 進(jìn)行了 copy 操作。如果不寫 copy ,該類的調(diào)用者有可能會(huì)忘記或者根本不知道“編譯器會(huì)自動(dòng)對(duì) block 進(jìn)行了 copy 操作”,他們有可能會(huì)在調(diào)用之前自行拷貝屬性值。這種操作多余而低效。

9、用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?

用 @property 聲明 NSString、NSArray、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進(jìn)行賦值操作(就是把可變的賦值給不可變的),為確保對(duì)象中的字符串值不會(huì)無意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。

  1. 因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用 copy 無論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本。
  2. 如果我們使用是 strong ,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性。
    //總結(jié):使用copy的目的是,防止把可變類型的對(duì)象賦值給不可變類型的對(duì)象時(shí),可變類型對(duì)象的值發(fā)送變化會(huì)無意間篡改不可變類型對(duì)象原來的值。

10、這個(gè)寫法會(huì)出什么問題:@property (nonatomic, copy) NSMutableArray *arr;

問題:添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰。
//如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
// copy后返回的是不可變對(duì)象(即 arr 是 NSArray 類型,NSArray 類型對(duì)象不能調(diào)用 NSMutableArray 類型對(duì)象的方法)
原因:是因?yàn)?copy 就是復(fù)制一個(gè)不可變 NSArray 的對(duì)象,不能對(duì) NSArray 對(duì)象進(jìn)行添加/修改。

答案都是收集而來,如果有什么錯(cuò)誤,歡迎指正!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,657評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,242評(píng)論 8 265
  • 在這二十幾年的時(shí)間中,有過為成長(zhǎng)落淚的瞬間,有過為學(xué)業(yè)拼命的夜晚,有過為友情掛牽的幸福,也有過為愛情感傷的纏綿。 ...
    仁簫閱讀 590評(píng)論 0 1
  • 最近在公司做了我們的pc端網(wǎng)站。需求:實(shí)現(xiàn)網(wǎng)頁的下拉加載頁面思路: 中包含list,這是一個(gè)list中包含的元素塊...
    薛云龍閱讀 8,703評(píng)論 4 4
  • 夢(mèng)想再大也不覺大,追想的人再小也不嫌小,做個(gè)勇敢的蝸牛,夢(mèng)想總有一天會(huì)實(shí)現(xiàn)。說得真好,做個(gè)勇敢的蝸牛,一步步,堅(jiān)持...
    信兒315閱讀 149評(píng)論 0 0

友情鏈接更多精彩內(nèi)容