用户定义的运行时属性和关联对象

时间:2015-04-06 16:53:04

标签: ios objective-c xcode xcode-storyboard associated-object

我目前正尝试使用以下算法在Xcode 6中使用用户定义的运行时属性:

  1. 使用关联对象

    向UIView类添加自定义属性
    #define ASSOCIATED_OBJECT_GETTER_AND_SETTER(propertyType, propertyName, propertyNameWithCapital, associationType)   \
    -(void)set##propertyNameWithCapital:(propertyType)_value                                                            \
    {                                                                                                                   \
        objc_setAssociatedObject(self, @selector(propertyName), _value, associationType);                               \
    }                                                                                                                   \
    -(propertyType)propertyName                                                                                         \
    {                                                                                                                   \
        return objc_getAssociatedObject(self, @selector(propertyName));                                                 \
    }                                                                                                                   \                                       
    
    @interface eMyTags : NSObject
    @property (nonatomic) NSString* name;
    @end
    
    @implementation eMyTags
    @synthesize name;
    @end
    
    @interface UIView (MyTags)
    @property (nonatomic) eMyTags* myTags;
    @property (nonatomic) NSString* myName;
    @end
    
    @implementation UIView (MyTags)
    @dynamic myTags, myName;
    ASSOCIATED_OBJECT_GETTER_AND_SETTER(eMyTags*, myTags, MyTags, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    ASSOCIATED_OBJECT_GETTER_AND_SETTER(NSString*, myName, MyName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    @end
    
  2. 通过Xcode故事板设置这些属性的值 enter image description here

  3. 在运行时

    中访问代码中的这些属性
    -(void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"myName: %@", view.myName);
        NSLog(@"myTags.name: %@", view.myTags.name);
    }
    
  4. 当我编译并运行输出时:

    myName: bla
    myTags.name: (null)
    

    为什么没有设置myTags.name?我错过了什么?我不能设置自定义类型的用户定义运行时属性吗?

1 个答案:

答案 0 :(得分:1)

myTags未在内存中分配,也未初始化。另一方面,值@“bla”是一个字符串文字,它实际上是NSString的一个实例,并指向内存中的一个位置。