用户定义的运行时属性和关联对象
User Defined Runtime Attributes and Associated Objects
我目前正在尝试通过以下算法在 Xcode 6 中使用用户定义的运行时属性:
使用关联对象将自定义属性添加到 UIView class
#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
通过 Xcode 故事板设置这些属性的值
在运行时间
期间在代码中访问这些属性
-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"myName: %@", view.myName);
NSLog(@"myTags.name: %@", view.myTags.name);
}
当我编译并且 运行 输出是:
myName: bla
myTags.name: (null)
那为什么不设置myTags.name
呢?我错过了什么?我不能设置自定义类型的用户定义运行时属性吗?
好吧myTags
没有在内存中分配也没有初始化。另一方面,值 @"bla" 是一个字符串文字,它实际上是 NSString
的一个实例并指向内存中的一个位置。
我目前正在尝试通过以下算法在 Xcode 6 中使用用户定义的运行时属性:
使用关联对象将自定义属性添加到 UIView class
#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
通过 Xcode 故事板设置这些属性的值
在运行时间
期间在代码中访问这些属性-(void)viewDidLoad { [super viewDidLoad]; NSLog(@"myName: %@", view.myName); NSLog(@"myTags.name: %@", view.myTags.name); }
当我编译并且 运行 输出是:
myName: bla
myTags.name: (null)
那为什么不设置myTags.name
呢?我错过了什么?我不能设置自定义类型的用户定义运行时属性吗?
好吧myTags
没有在内存中分配也没有初始化。另一方面,值 @"bla" 是一个字符串文字,它实际上是 NSString
的一个实例并指向内存中的一个位置。