class_copyIvarList和class_copyMethodList

Objective-C内存管理与运行时
本文通过一个Objective-C的Dog类实例,展示了如何使用Objective-C的运行时API来获取类的所有成员变量和方法。这有助于理解Objective-C的内存管理和运行时特性。

直接看代码吧


Dog.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject

@property(nonatomic, strong) NSString * dogName;
@property(nonatomic, assign) NSInteger dogAge;

@end

Dog.m

#import "Dog.h"

@interface Dog ()

@property(nonatomic, strong) NSString * dogSex;

@end

@implementation Dog

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.dogName = @"dahuang";
        self.dogAge = 2;
    }
    return self;
}

- (void) printDogName
{
    NSLog(@"dogName");
}

@end

测试代码:

#import "ViewController.h"
#import <objc/runtime.h>
#import <objc/message.h>
#import "Person.h"
#import "Dog.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Dog * dog = [[Dog alloc] init];
    
    unsigned int outCount = 0;
    
    unsigned int outCountMethod = 0;
    
    Ivar * ivars = class_copyIvarList([dog class], &outCount);
    
    Method * methods = class_copyMethodList([dog class], &outCountMethod);
    
    for (int i = 0; i<outCount; i++) {
        // 取出i位置对应的成员变量
        Ivar ivar = ivars[i];
        
        // 查看成员变量
        const char *name = ivar_getName(ivar);
        
        
        NSLog(@"%s", name);
    }
    
    for (int j = 0; j < outCountMethod; j++) {
        
        Method method = methods[j];
        
        SEL methodSEL = method_getName(method);
        
        const char * selName = sel_getName(methodSEL);
        
        if (methodSEL) {
            NSLog(@"sel------%s", selName);
        }
    }
        
}


输出:

2015-11-02 12:18:07.851 02-runtime[1970:51391] _dogName
2015-11-02 12:18:07.852 02-runtime[1970:51391] _dogAge
2015-11-02 12:18:07.853 02-runtime[1970:51391] _dogSex
2015-11-02 12:18:07.853 02-runtime[1970:51391] sel------setDogName:
2015-11-02 12:18:07.854 02-runtime[1970:51391] sel------setDogAge:
2015-11-02 12:18:07.855 02-runtime[1970:51391] sel------printDogName
2015-11-02 12:18:07.855 02-runtime[1970:51391] sel------dogName
2015-11-02 12:18:07.855 02-runtime[1970:51391] sel------dogAge
2015-11-02 12:18:07.856 02-runtime[1970:51391] sel------dogSex
2015-11-02 12:18:07.856 02-runtime[1970:51391] sel------setDogSex:
2015-11-02 12:18:07.856 02-runtime[1970:51391] sel------.cxx_destruct
2015-11-02 12:18:07.857 02-runtime[1970:51391] sel------init






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值