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