美文网首页
iOS 运行时机制

iOS 运行时机制

作者: 难却却 | 来源:发表于2017-02-04 15:04 被阅读39次

    转自 http://www.cnblogs.com/cqcnblogs/p/5787355.html

    一 , Objective-C运行时定义了几种重要的类型。

    Class:定义Objective-C类

    Ivar:定义对象的实例变量,包括类型和名字。

    Protocol:定义正式协议。

    objc_property_t:定义属性。叫这个名字可能是为了防止和Objective-C 1.0中的用户类型冲突,那时候还没有属性。

    Method:定义对象方法或类方法。这个类型提供了方法的名字(就是**选择器**)、参数数量和类型,以及返回值(这些信息合起来称为方法的**签名**),还有一个指向代码的函数指针(也就是方法的**实现**)。

    SEL:定义选择器。选择器是方法名的唯一标识符。

    IMP:定义方法实现。这只是一个指向某个函数的指针,该函数接受一个对象、一个选择器和一个可变长参数列表(varargs),返回一个对象

    二 ,class_copyPropertyList与class_copyIvarList区别

    class_copyPropertyList:

    通过类名获得类的属性变量。

    class_copyIvarList

    通过类名获得类的实例变量。

    也就是说:

    class_copyPropertyList获得的是由@property修饰过的变量,

    class_copyIvarList获得的是class_copyPropertyList修饰的以及在m文件的中@implementation内定义的变量

    eg:

    //.h

    @interface Model : NSObject

    @property (nonatomic,copy) NSString *sex;

    @property (nonatomic,copy) NSString *name;

    @property (nonatomic,assign) NSInteger age;

    @property (nonatomic,strong) NSDictionary *imgCode;

    @end

    //.m

    @interface Model ()

    @property (nonatomic,copy) NSString *Id;

    @end

    @implementation Model {

    NSInteger _index;

    }

    @end

    //使用的时候

    unsigned int propertiesCount =0;

    unsigned int ivarsCount =0;

    objc_property_t *properties = class_copyPropertyList(Model, &propertiesCount);

    Ivar *ivars = class_copyIvarList(Model, &ivarsCount);

    则 propertiesCount = 5

    ivarsCount = 6

    相关文章

      网友评论

          本文标题:iOS 运行时机制

          本文链接:https://www.haomeiwen.com/subject/rwnjittx.html