【Object C】 反射機制

Object-C 也提供了類似Java的反射機制。通過以下三種方式與運行環境交互:
1、直接通過Object-C源代碼
2、通過NSObject中定義的方法:
isKindOfClass
isMemberOfClass
responseToSelector:判斷該實例是否調用指定方法
3、直接調用運行時函數進行動態編程

#import <Foundation/Foundation.h>
#import
"DCApple.h"
int main(int argc, const char * argv[]) {
   
@autoreleasepool {
       
// insert code here...
       
NSLog(@"Hello, World!");
       
// 通過字符串來獲取Class
        Class clazz =
NSClassFromString(@"NSDate");
       
NSLog(@"%@" , clazz);
       
// 直接使用Class來創建對象
       
id date = [[clazz alloc] init];
       
NSLog(@"%@" , date);
       
// 通過對象來獲取Class
       
NSLog(@"%@" , [date class]);
       
// 通過類來獲取class
       
NSLog(@"%d" , clazz == NSDate.class);
    }
   
return 0;
}

===>>
2014-12-01 09:06:25.916 reflection[1179:303] Hello, World!
2014-12-01 09:06:25.917 reflection[1179:303] NSDate
2014-12-01 09:06:25.924 reflection[1179:303] 2014-12-01 01:06:25 +0000
2014-12-01 09:06:25.925 reflection[1179:303] __NSDate
2014-12-01 09:06:25.925 reflection[1179:303] 1
Program ended with exit code: 0

檢查繼承關係
conformsToProtocol:傳入一個Protocol 參數,用於判斷該類及其子類的實例。
//
//  main.m
//  reflection
//
//  Created by mac on 14-12-1.
//  Copyright (c) 2014 mac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import
"DCApple.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
       // 判斷對象是否爲某個類及其子類的實例
       
NSLog(@"app是否爲DCApple及其子類的實例:%d",
              [app
isKindOfClass: DCApple.class]);
       
NSLog(@"app是否爲NSObject及其子類的實例:%d",
              [app
isKindOfClass: NSObject.class]);
       
NSLog(@"app2是否爲DCApple及其子類的實例:%d",
              [app2
isKindOfClass: DCApple.class]);
       
NSLog(@"app2是否爲NSObject及其子類的實例:%d",
              [app2
isKindOfClass: NSObject.class]);
       
// 判斷對象是否實現了指定協議
       
NSLog(@"app是否實現DCEatable協議:%d",
              [app
conformsToProtocol: @protocol(DCEatable)]);
       
NSLog(@"app2是否實現了DCEatable協議:%d",[app2 conformsToProtocol: @protocol(DCEatable)]);
       
    }
   
return 0;
}
=====>>
2014-12-01 14:07:26.220 reflection[2195:303] DCApple
2014-12-01 14:07:26.220 reflection[2195:303] DCApple1
2014-12-01 14:07:26.221 reflection[2195:303] app
是否爲DCApple的實例:1
2014-12-01 14:07:26.221 reflection[2195:303] app
是否爲NSObject的實例:0
2014-12-01 14:07:26.222 reflection[2195:303] app2
是否爲NSObject的實例:0
2014-12-01 14:07:26.222 reflection[2195:303] app2
是否爲DCApple的實例:0
2014-12-01 14:07:26.223 reflection[2195:303] app2
是否爲DCApple的實例:1
2014-12-01 14:07:26.223 reflection[2195:303] app
是否爲DCApple及其子類的實例:1
2014-12-01 14:07:26.224 reflection[2195:303] app
是否爲NSObject及其子類的實例:1
2014-12-01 14:07:26.224 reflection[2195:303] app2
是否爲DCApple及其子類的實例:1
2014-12-01 14:07:26.225 reflection[2195:303] app2
是否爲NSObject及其子類的實例:1
2014-12-01 14:07:26.225 reflection[2195:303] app
是否實現DCEatable協議:1
2014-12-01 14:07:26.225 reflection[2195:303] app2
是否實現了DCEatable協議:1
Program ended with exit code: 0
發佈了55 篇原創文章 · 獲贊 86 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章