移動網際網路行業一直是社會發展的一個趨勢,且這幾年快速十分迅速,諸如BAT這些大型的網際網路企業的用戶也是主要以移動端用戶為主。
而iOS開發本身就屬於移動開發,所以它依舊是目前熱門的行業,今天小編就跟大家聊聊iOS面試必考的幾大知識點。
●你是否接觸過OC中的反射機制?簡單聊一下概念和使用
Class反射
通過類名的字符串形式實例化對象
Class class NSClassFromString@(@」student」);
Student *stu = [[class alloc ]init];
將類名變為字符串
Class class =[Student class];
NSString*className = NSStringFromClass(class);
SEL的反射
通過方法的字符串形式實例化方法
SEL selector = NSSelectorFromClass(@」setName」);
[stu perform Selector:selector withObject:@」Mike」];
將方法變成字符串
NSString FomrSelector(@selector*(setName:))
●編寫一個函數,實現遞歸刪除指定路徑下的所有文件
+ (void)deleteFiles:(NSString *)path;{
NSFileManager * fileManger = [NSFileManager defaultManager];
BOOL isDir = NO;
BOOL isExist = [fileManger fileExistsAtPath:path isDirectory:&isDir];
if (isExist) {
if (isDir) {
NSArray * dirArray = [fileManger
contentsOfDirectoryAtPath:path error:nil];
NSString * subPath = nil;
for (NSString * str in dirArray) {
subPath = [path stringByAppendingPathComponent:str];
BOOL issubDir = NO;
[fileManger fileExistsAtPath:subPath isDirectory:&issubDir];
[self deleteFiles:subPath];
}
}else{
NSLog(@"%@",path);
[manager removeItemAtPath:filePath error:nil];
}
}else{
NSLog(@"你列印的是目錄或者不存在");
}
}
●Runloop和線程有什麼關係?
主線程的run loop默認是啟動的
iOS的應用程式裡面,程序啟動後會有一個如下的main()函數
(arc,*argv[]){
@autoreleasepool{
Return UIApplicationMain(argc,argv,,NSStringFromClass([AppDelegate class]));
}
}
重點是UIApplicationMain()函數,這個方法會為mainthread設置一個NSRunLoop對象。這就解釋了:為什麼我們的應用可以在無人操作的時候休息,需要讓它幹活的時候又能立馬響應。
對其它線程來說,runloop默認是沒有啟動的,runloop只在你要和線程有交互時才需要。在任何一個Cocoa程序的線程中,都可以通過以下代碼來獲取到當前賢臣的runloop。
NSRunLoop*runloop = [NSRunLoop currentRunLoop];
●Obiective-C如何對已有的方法,添加自己的功能代碼以實現類似記錄日誌這樣的功能?
+(NSString *)myLog
{
}
+(void)load
{
Method description = class_getClassMethod(self, @selector(description));
Method myLog = class_getClassMethod(self, @selector(myLog));
method_exchangeImplementations(description, myLog);
}
●舉例說明Swift裡邊有哪些是Objective-C中沒有的?
Swift引入了在Objective-C中沒有的一些高級數據類型,例如tuples(元祖),可以使你創建和傳遞一組數值。
Swift還引入了可選項類型(Optionals),用於處理變量值不存在的情況。可選項的意思有兩種,一種變量是存在的,例如等於X,而是變量值根本不存在。Optionals類似於Objective-C中指向nil的指針、但是適用於所有的數據類型,而非僅僅局限於類,Optionals相比於Objective-C中nil指針更加安全簡明,並且也是Swift諸多最大功能的核心。
●KVC的底層實現?
當一個對象調用setValue方法時,方法內部會做以下操作:
①檢查是否存在相應key的set方法,如果存在,就調用set方法
②如果set方法不存在,就會查找與key相同名稱並且帶下劃線的成員屬性,如果有,則直接給成員屬性賦值
③如果沒有找到_key,就會查找相同名稱的屬性key,如果有就直接賦值
④如果還沒找到,則調用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
這些方法的默認實現都是拋出異常,我們可以根據需要重寫它們。
●KVO的底層實現?
- kvo基於runtime機制實現。
- 使用了isa混寫(isa-swizzling),當一個對象(假設是person對象,person的類是MYPerson)的屬性值(假設person的age)發生改變時,系統會自動生成一個類,繼承自MYPerson:NSKVONotifying_MYPerson,在這個類的setAge方法裡面,調用[super setAge:age] [self willChangeValueForKey:@"age"] 和 [self didChangeValueForKey:@"age"],而這兩個方法內部會主動調用監聽者內部的 - (void)observeValueForKeyPath 這個方法。
- 想要看到NSKVONotifying_MYPerson很簡單,在self.person.age = 20; 這裡打斷點,在調試區域就能看到_person->NSobject->isa=(Class)NSKVONotifying_MYPerson,同時我們在 self.person = [[MYPerson alloc]init];後面打斷點,看到_person->NSObject->isa=(Class)MYPerson,由此可見,在添加監聽者之後,person類型已經由MYPerson被改變成NSKVONotifying_MYPerson
有人說iOS行情越來越難,其實這種說話並不準確,在行動網路愈加普及的今天,iOS程式設計師失業的情況是不會出現的。目前市場上iOS初級開發者人滿為患,但中級高級的開發者依舊非常稀缺,在這個時候,就需要提高自己的技術。