1

我正忙于将我的 Objective C 代码转换为 ARC(自动引用计数),并遇到了以下问题:

ARC 不允许将“NSInteger”(又名“int”)转换为“SomeRandomObject”。

现在在我们的应用程序中(不幸的是)我们一直在使用标签 NSInteger 属性,例如位于 UITextField、UISwitch 等上的标签,将对象链接到控件。

例如

Field *field = [[Field alloc] init...
UITextField *textField = [[UITextField alloc]....
textField.tag = (NSInteger)field;

当代码到达事件时,您可以简单地执行此操作

UITextField *textField = (UITextField*)sender;
Field *field = (Field*)textField.tag; // ARC hates this

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

4

4 回答 4

3

更好的方法是继承 UITextField 并添加您希望它具有的属性。如果您绝对需要向您无法控制其类的对象添加属性,您可以使用objc_setAssociatedObject()和朋友——它有点低级,可能有点hacky,但肯定比重载tag属性要少。

于 2012-04-12T19:30:15.730 回答
2

我不确定是否有标准的方法来做你所追求的,但你可以UITextField用一个Field属性进行子类化。

或者,您可以拥有一些NSDictionarys并为您的财产Field使用一些唯一标识符。tag

于 2012-04-12T19:31:48.283 回答
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
于 2012-04-12T19:37:44.953 回答
1

补充一下查克所说的,这比我之前发布的更正确。

您可以在 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 );
}
于 2012-04-12T19:30:19.440 回答