iOS 通过运行时获取ivars,properties,class methods以及instance methods

本文深入探讨了iOS运行时技术的应用,包括如何获取类的属性、成员变量及方法列表等关键知识点。通过具体实例,展示了如何利用Objective-C运行时API进行类的深入探索。

工程代码详细参考我的github:https://github.com/pwf2006/iOS-RunTime

运行时获取类的properties

//获取类的属性   
- (void)getPropertyList {   

    //属性个数   

    unsigned int count;    

    objc_property_t *properties = class_copyPropertyList([self class], &count);   

    for (int i = 0; i < count; i++) {   

        objc_property_t property = properties[i];   

        const char *name = property_getName(property);   

        NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];   

        NSLog(@"***属性名:%@", nameStr);   

    }   
    free(properties);   
}

此种方法只能获取类的属性,像:

@interface HomeController (){   
    int index;   
    NSString *name1;   
}   

这种方式声明的"index"和"name1"这种成员变量是无法通过上述方法获取到的,如果获取该种变量则可使用class_copyIvarList()方法来获取.

运行时获取类ivars

这里给出一个类:

@interface HomeController (){   

    int index;   

    NSString *name1;   

}   

@property (nonatomic, strong) UILabel *msgLbl;   
@end   

如果要获取"index","name1","msgLbl"这三个名字呢,有一个函数可以办到class_copyIvarList(),详细使用见工程.

运行获取类的instance methods

IOS中每一个类都有一个方法列表,用来保存类的实例方法,实例方法第一次调用完之后,会进行缓存方便下次调用.获取类的实例方法可以用class_copyMethodList()来获取.

运行时获取类的 class methods

每一个类都有一个方法列表保存该类的所有实例方法和其对应的实现,但一个类的类方法则不在这个方法列表中.那么一个类的类方法保存在那里呢?如何通过运行时的一些特性获取这些类方法呢?
在IOS开发中每一个类其实也是一个对象,既然IOS中每一个类是一个对象,那么它是什么类的对象呢?IOS中有一个元类的概念,即每一个类都有一个元类,通过isa指针指向自己的元类;元类也可以继承,每一个元类直接继承自根元类;NSObject类也有自己的元类,即根元类,并且根元类的isa指针指向它本身(根元类).类方法不同于类的实例方法,类方法保存在一个类的元类中,如何获取一个类的元类呢?有两种方法:

1. const char * class_name = class_getName([self class]);  
   Class metaClass = objc_getMetaClass(class_name);
2. Class metaClass = object_getClass([self class]);   

在获取到一个类的元类之后,我们就可以通过class_copyMethodList()来获取一个类的类方法.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值