IOS目标C ARC转换问题

时间:2012-04-12 19:24:12

标签: objective-c

我正忙着将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

实现这一目标的更标准/更好的方法是什么?

4 个答案:

答案 0 :(得分:3)

更好的方法是继承UITextField并添加您希望它拥有的属性。如果你绝对需要向你无法控制的类的对象添加属性,你可以使用objc_setAssociatedObject()和朋友 - 它有点低级,也许有点hacky,但肯定不如重载{{} 1}}属性。

答案 1 :(得分:2)

我不确定是否有标准方法可以执行您所追求的内容,但您可以使用UITextField属性将Field子类化。

或者,您可以拥有一些NSDictionary Fieldtag并为您的{{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 );
}