Reflection反射在iOS下使用Objective-C 具體如何使用


     反射,一種計算機處理方式。是程序可以訪問、檢測和修改它本身狀態或行為的一種能力。

程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然后,可以調用類型的方法或訪問其字段和屬性。


以下本博主在空閑之余,使用Objective-C寫了一個demo

https://github.com/VictorZhang2014/ReflectionDemo

每一步的代碼意思都已清晰備注,話不多說,以下我粘貼下代碼,在Github上有完整的DEMO項目,可以供測試

以下有兩個方法

test() 獲取當前app運行過程中,由開發者(自己)創建的類的列表,不包括運行時系統創建的類 

test2() 獲取當前app運行時所用到所有的文件,包括 系統創建的類和開發者創建的類的 列表

請分開測試

高手請略過

</pre><pre code_snippet_id="1848857" snippet_file_name="blog_20160824_2_1903016" name="code" class="objc">#import "ViewController.h"
#import <objc/runtime.h>
#import <dlfcn.h>
#import <mach-o/ldsyms.h>
#import "MyClass2.h"


//http://stackoverflow.com/questions/19298553/get-list-of-all-native-classes
//這個stackoverflow上有說明

//方式1
//獲取當前app運行過程中,由開發者創建的類的 列表
void test()
{
unsigned int count;
const char **classes;
Dl_info info;

//1.獲取app的路徑
dladdr(&_mh_execute_header, &info);

//2.返回當前運行的app的所有類的名字,並傳出個數
//classes:二維數組 存放所有類的列表名稱
//count:所有的類的個數
classes = objc_copyClassNamesForImage(info.dli_fname, &count);

for (int i = 0; i < count; i++) {
//3.遍歷並打印,轉換Objective-C的字符串
NSString *className = [NSString stringWithCString:classes[i] encoding:NSUTF8StringEncoding];
Class class = NSClassFromString(className);
NSLog(@"class name = %@", class);

//根據類名調用
if ([className isEqualToString:@"MyClass2"]) {
MyClass2 *my = [[class alloc] init];

//調用實例方法
[my test1];

//調用類方法
[class test2];
}

}
}

//方式2
//獲取當前app運行時所用到所有的文件,包括 系統創建的類和開發者創建的類的 列表
void test2()
{
int numClasses;
Class * classes = NULL;

//1.獲取當前app運行時所有的類,包括系統創建的類和開發者創建的類的 個數
numClasses = objc_getClassList(NULL, 0);

if (numClasses > 0 )
{
//2.創建一個可以容納numClasses個的大小空間
classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);

//3.重新獲取具體類的列表和個數
numClasses = objc_getClassList(classes, numClasses);

//4.遍歷
for (int i = 0; i < numClasses; i++) {
Class class = classes[i];
const char *className = class_getName(class);
NSLog(@"class name2 = %s", className);

//根據類名調用
if (strcmp(className, "MyClass2") == 0) {
MyClass2 *my = [[class alloc] init];

//調用實例方法
[my test1];

//調用類方法
[class test2];
}
}
free(classes);
}
}

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

test();
test2();


}

@end


如果讀者有不明白之處,可以留言,本博主會第一時間來回答得意







注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com