Objective-C 如何获取某个类型对应的Class对象 如何通过Class对象实例化处对象【反射】

总目录 iOS开发笔记目录 从一无所知到入门

Intro

在Java中有反射,就是说你拿到某个类型对应的Class对象,就可以用这个拿到的Class对象去实例化对应类型的对象。

举个例子:

// 有三种方法可以拿到某个类型对应的 Class对象。
Class clazz = Class.forName("com.test.Person");	// Class.forName("类的全路径");
// clazz = person.getClass();// 对象名.getClass();
// clazz = Person.class;		// 类名.class

// 用得到的Class对象实例化具体类型的对象。
Object obj = clazz.newInstance();
obj.xxx;	// 调用想要的操作。

而在 Objective-C 中也有反射这个特性所需的API:

[类名 class]
[对象名 class]
都可以获得该类型对应的 Class对象。

Demo

Screenshot

在这里插入图片描述

Code

//
//  main.m
//  类
//
//  Created by wuyujin1997 on 2023/2/26.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject
- (void) sayHi;
@end
@implementation Person
- (void) sayHi {
    
    
    NSLog(@"hello");
}
@end

int main(int argc, const char * argv[]) {
    
    
    
    Class personClass = [Person class];
    NSLog(@"按 [类名 class] 获取该类的Class对象: %@ %p", personClass, personClass);
    
    // 通过某个类型对应的Class对象可以实例化处该类的对象。
    Person *person = [personClass new];
    [person sayHi];
    
    Class personClassGetFromObject = [person class];
    NSLog(@"按 [对象 class] 获取该类的Class对象: %@ %p", personClassGetFromObject, personClassGetFromObject);
    
    return 0;
}

Output

2023-02-27 22:52:51.112666+0800 类[39830:1175942][类名 class] 获取该类的Class对象: Person 0x1000080c8
2023-02-27 22:52:51.112926+0800 类[39830:1175942] hello
2023-02-27 22:52:51.112954+0800 类[39830:1175942][对象 class] 获取该类的Class对象: Person 0x1000080c8
Program ended with exit code: 0

猜你喜欢

转载自blog.csdn.net/wuyujin1997/article/details/129251961
今日推荐