明天要去面試一個公司,今天復習下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);