OC成员变量(实例变量,属性)

2018-05-23  本文已影响0人  stonly916

关于实例变量和属性,我们看下面这个类

@interface ViewController : UIViewController
{
    int intV;
    NSString *_aaa;
    UIView *_testView;
}

@property (nonatomic, copy) NSString *bbb;
@property (nonatomic, copy) NSString *aaa;

@end

这里我用运行时获取实例:

unsigned int varNumbers;
Ivar *vars = class_copyIvarList(self.class, &varNumbers);

这里varNumbers数值为4,输出IvarName是:intV、_aaa、_testView、_bbb,

unsigned int proNumbers;
    objc_property_t *propertys = class_copyPropertyList(self.class, &proNumbers);

获取属性数量为2,分别是aaa和bbb。
这里就发现:

如果在.m文件中加入以下代码:

@implementation ViewController

@synthesize bbb=_aaa;
  ...
@end

属性bbb会关联上实例变量_aaa,导致系统不会自动创建_bbb,这时候用class_copyIvarList运行时获取实例数量就是3,输出IvarName是:intV、_aaa、_testView。而属性变量还是aaa和bbb。

关联变量:

- (void)setNumPro:(int)numPro
{
    objc_setAssociatedObject(self, @selector(numPro), @(numPro), OBJC_ASSOCIATION_ASSIGN);
}

- (int)numPro
{
    return [objc_getAssociatedObject(self, _cmd) intValue];
}

这里通过运行时,给self关联了一个numPro变量,用法与属性一样,但是不提供实例变量(即不能使用_numPro),使用运行时class_copyIvarListclass_copyPropertyList都无法获取到该对象。

上一篇 下一篇

猜你喜欢

热点阅读