1、Objective-C 中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么?
線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:
2、為什么我們常見的delegate屬性都用是weak而不是retain/strong?
是為了防止delegate兩端產生不必要的循環引用。
@property (nonatomic, weak) id delegate;
3、什么時候用delete,什么時候用Notification?
Delegate(委托模式):1對1的反向消息通知功能。
Notification(通知模式):只想要把消息發送出去,告知某些狀態的變化。但是并不關心誰想要知道這個。
4、你是否接觸過OC中的反射機制?簡單聊一下概念和使用
1). class反射
- 通過類名的字符串形式實例化對象。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
- 將類名變為字符串
Class class =[Student class];
NSString *className = NSStringFromClass(class);
2). SEL的反射
- 通過方法的字符串形式實例化方法。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
- 將方法變成字符串
NSStringFromSelector(@selector*(setName:));
5、isa指針問題
isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向對象的類,而Class里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當類方法被調 用時,先會從本身查找類方法的實現,如果沒有,元類會向他父類查找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass)。根元類的isa指針指向本身,這樣形成了一個封閉的內循環。
6、如何訪問并修改一個類的私有屬性?
1). 一種是通過KVC獲取。
2). 通過runtime訪問并修改私有屬性。
7、一個objc對象的isa的指針指向什么?有什么作用?
指向他的類對象,從而可以找到對象上的方法。
8、怎么用 copy 關鍵字?
用途:
- NSString、NSArray、NSDictionary 等等經常使用copy關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary;
- block 也經常使用 copy 關鍵字。
說明:
block 使用 copy 是從 MRC 遺留下來的“傳統”,在 MRC 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區.在 ARC 中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作。如果不寫 copy ,該類的調用者有可能會忘記或者根本不知道“編譯器會自動對 block 進行了 copy 操作”,他們有可能會在調用之前自行拷貝屬性值。這種操作多余而低效。
9、用@property聲明的 NSString / NSArray / NSDictionary 經常使用 copy 關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?
用 @property 聲明 NSString、NSArray、NSDictionary 經常使用 copy 關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進行賦值操作(就是把可變的賦值給不可變的),為確保對象中的字符串值不會無意間變動,應該在設置新屬性值時拷貝一份。
- 因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本。
- 如果我們使用是 strong ,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性。
//總結:使用copy的目的是,防止把可變類型的對象賦值給不可變類型的對象時,可變類型對象的值發送變化會無意間篡改不可變類型對象原來的值。
10、這個寫法會出什么問題:@property (nonatomic, copy) NSMutableArray *arr;
問題:添加,刪除,修改數組內的元素的時候,程序會因為找不到對應的方法而崩潰。
//如:-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
// copy后返回的是不可變對象(即 arr 是 NSArray 類型,NSArray 類型對象不能調用 NSMutableArray 類型對象的方法)
原因:是因為 copy 就是復制一個不可變 NSArray 的對象,不能對 NSArray 對象進行添加/修改。
答案都是收集而來,如果有什么錯誤,歡迎指正!