2018年底,IOS面試題的複習之OC的反射機制
明天要去面試一個公司,今天覆習下IOS題目吧
1.說一下OC的反射機制
答:OC的反射機制類似於JAVA的反射機制,這種動態反射機制可以讓OC語言更加靈活。這句話是對反射機制的初步認識,具體表現在哪裡使得他類似JAVA的反射機制,又如何讓OC語言更加的靈活呢?可以通過一些程式碼去更好的理解。總的來說,OC的反射機制主要有三個用途:
1.獲得CLASS
2.檢查繼承關係
3.動態呼叫方法
先來說說第一個用途,獲得class的具體用法:
#import "Person.h"
//1.通過字串來獲取class
Class classname = NSClassFromString("Persong");
NSLog(@"%@", className);
//2.直接使用Class來建立,一般情況下我們都使用這種方法
Person *person = [[Person alloc] init];
NSLog(@"%@", person);
//然後通過例項物件去獲取Class .[person class]方法
NSLog(@"%@", [person class]);
//3.通過類來獲得Class
NSLog(@"Person.Class = %@", [Person class])
再來說說第二個用途,也就是檢查繼承關係
//NSObject提供了一些方法可供一般物件直接呼叫(繼承與NSObject)。
//1.通過物件,來判斷該物件的Class也就是[物件 class]方法;
Person *person = [[Person alloc] init];
SLog(@"[person class] = %@", [person class]);
//2.去判斷某個物件是否為某個類的例項物件isMemberOfClass:Person
NSLog(@"person是否是Person的例項物件:%d", [person isMemberOfClass:Person.class]);
//3.判斷某個例項物件是否為某個類及其子類的例項isKindOfClass
NSLog(@"[person isKindOfClass:[person class]] = %d ", [person isKindOfClass:[person class]]);
//3.判斷某個例項是否實現了指定的協議
NSLog(@"%d", [person conformsToProtocol:@protocol(UITableViewDelegate)]);
最後說說第三個用途,動態呼叫方法
//此處希望呼叫remove方法
// (1)使用 performSelector: withObject: 動態的呼叫move:方法(訊息傳遞)
[self performSelector:@selector(move:) withObject:@2];
[self performSelector:NSSelectorFromString(@"move:") withObject:@10];
// (2)使用objc_msgSend 進行實現方法(為某個類物件傳送訊息,並返回一個值。引數1,2分別是接收訊息的例項物件,要執行的方法)
objc_msgSend(self, @selector(move:), @4);
objc_msgSend(self, @selector(test:andNum:), @1, @2);