我正忙着将Objective C代码转换为ARC(自动引用计数),并遇到以下问题:
ARC不允许将'NSInteger'(又名'int')转换为'SomeRandomObject'。
现在,在我们的应用程序中,我们(遗憾地)使用了标签NSInteger属性,例如位于UITextField,UISwitch等,用于将对象链接到控件。
e.g。
Field *field = [[Field alloc] init...
UITextField *textField = [[UITextField alloc]....
textField.tag = (NSInteger)field;
sooo当代码到达事件时,您可以简单地执行此操作
UITextField *textField = (UITextField*)sender;
Field *field = (Field*)textField.tag; // ARC hates this
实现这一目标的更标准/更好的方法是什么?
答案 0 :(得分:3)
更好的方法是继承UITextField并添加您希望它拥有的属性。如果你绝对需要向你无法控制的类的对象添加属性,你可以使用objc_setAssociatedObject()
和朋友 - 它有点低级,也许有点hacky,但肯定不如重载{{} 1}}属性。
答案 1 :(得分:2)
我不确定是否有标准方法可以执行您所追求的内容,但您可以使用UITextField
属性将Field
子类化。
或者,您可以拥有一些NSDictionary
Field
个tag
并为您的{{1}}媒体资源使用一些唯一标识符。
答案 2 :(得分:2)
作为@Chuck所讨论的一个例子,这里是一个使用类别的简单实现:
@interface UITextField(fieldAdditions)
@property(strong, nonatomic) id field;
@end
@implementation UITextField(fieldAdditions)
-(id) field
{
return objc_getAssociatedObject(self, @"field");
}
-(void) setField:(id)field
{
objc_setAssociatedObject(self, @"field", field, OBJC_ASSOCIATION_RETAIN);
}
@end
答案 3 :(得分:1)
添加到chuck所说的内容比我之前发布的内容更正确。
您可以在NSObject上添加类别:
- (void) associateValue:(id)value withKey:(NSString *)aKey {
objc_setAssociatedObject( self, (__bridge void *)aKey, value, OBJC_ASSOCIATION_RETAIN );
}
- (id) associatedValueForKey:(NSString *)aKey {
return objc_getAssociatedObject( self, (__bridge void *)aKey );
}