1. 程式人生 > >2018年底,IOS面試題的複習之OC的反射機制

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);