1、Objective-C 中創(chuàng)建線程的方法是什么楔壤?如果在主線程中執(zhí)行代碼鹤啡,方法是什么?如果想延時(shí)執(zhí)行代碼蹲嚣、方法又是什么递瑰?
線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch隙畜、使用子類(lèi)化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼抖部,方法是performSelectorOnMainThread,如果想延時(shí)執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone:
2议惰、為什么我們常見(jiàn)的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)心誰(shuí)想要知道這個(gè)辆憔。
4撇眯、你是否接觸過(guò)OC中的反射機(jī)制?簡(jiǎn)單聊一下概念和使用
1). class反射
- 通過(guò)類(lèi)名的字符串形式實(shí)例化對(duì)象虱咧。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
- 將類(lèi)名變?yōu)樽址?/li>
Class class =[Student class];
NSString *className = NSStringFromClass(class);
2). SEL的反射
- 通過(guò)方法的字符串形式實(shí)例化方法熊榛。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
- 將方法變成字符串
NSStringFromSelector(@selector*(setName:));
5、isa指針問(wèn)題
isa:是一個(gè)Class 類(lèi)型的指針. 每個(gè)實(shí)例對(duì)象有個(gè)isa的指針,他指向?qū)ο蟮念?lèi),而Class里也有個(gè)isa的指針, 指向meteClass(元類(lèi))彤钟。元類(lèi)保存了類(lèi)方法的列表来候。當(dāng)類(lèi)方法被調(diào) 用時(shí),先會(huì)從本身查找類(lèi)方法的實(shí)現(xiàn),如果沒(méi)有,元類(lèi)會(huì)向他父類(lèi)查找該方法跷叉。同時(shí)注意的是:元類(lèi)(meteClass)也是類(lèi),它也是對(duì)象逸雹。元類(lèi)也有isa指針,它的isa指針最終指向的是一個(gè)根元類(lèi)(root meteClass)营搅。根元類(lèi)的isa指針指向本身,這樣形成了一個(gè)封閉的內(nèi)循環(huán)。
6梆砸、如何訪問(wèn)并修改一個(gè)類(lèi)的私有屬性转质?
1). 一種是通過(guò)KVC獲取。
2). 通過(guò)runtime訪問(wèn)并修改私有屬性帖世。
7休蟹、一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用日矫?
指向他的類(lèi)對(duì)象,從而可以找到對(duì)象上的方法赂弓。
8、怎么用 copy 關(guān)鍵字哪轿?
用途:
- NSString盈魁、NSArray、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字窃诉,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類(lèi)型:NSMutableString杨耙、NSMutableArray、NSMutableDictionary飘痛;
- block 也經(jīng)常使用 copy 關(guān)鍵字珊膜。
說(shuō)明:
block 使用 copy 是從 MRC 遺留下來(lái)的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫(xiě)不寫(xiě)都行:對(duì)于 block 使用 copy 還是 strong 效果是一樣的,但寫(xiě)上 copy 也無(wú)傷大雅宣脉,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì) block 進(jìn)行了 copy 操作车柠。如果不寫(xiě) copy ,該類(lèi)的調(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)鍵字践险,可能造成什么問(wèn)題猿妈?
用 @property 聲明 NSString、NSArray巍虫、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字彭则,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類(lèi)型:NSMutableString、NSMutableArray占遥、NSMutableDictionary俯抖,他們之間可能進(jìn)行賦值操作(就是把可變的賦值給不可變的),為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)瓦胎,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份芬萍。
- 因?yàn)楦割?lèi)指針可以指向子類(lèi)對(duì)象,使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用 copy 無(wú)論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本尤揣。
- 如果我們使用是 strong ,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性。
//總結(jié):使用copy的目的是柬祠,防止把可變類(lèi)型的對(duì)象賦值給不可變類(lèi)型的對(duì)象時(shí)北戏,可變類(lèi)型對(duì)象的值發(fā)送變化會(huì)無(wú)意間篡改不可變類(lèi)型對(duì)象原來(lái)的值。
10漫蛔、這個(gè)寫(xiě)法會(huì)出什么問(wèn)題:@property (nonatomic, copy) NSMutableArray *arr;
問(wèn)題:添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰嗜愈。
//如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
// copy后返回的是不可變對(duì)象(即 arr 是 NSArray 類(lèi)型,NSArray 類(lèi)型對(duì)象不能調(diào)用 NSMutableArray 類(lèi)型對(duì)象的方法)
原因:是因?yàn)?copy 就是復(fù)制一個(gè)不可變 NSArray 的對(duì)象莽龟,不能對(duì) NSArray 對(duì)象進(jìn)行添加/修改蠕嫁。
答案都是收集而來(lái),如果有什么錯(cuò)誤毯盈,歡迎指正拌阴!