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)鍵字?
用途:
- 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 遺留下來的“傳統(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í)拷貝一份。
- 因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用 copy 無論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本。
- 如果我們使用是 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ò)誤,歡迎指正!