1

Objective C コードを ARC (自動参照カウント) に変換するのに忙しく、次の問題に遭遇しました。

「NSInteger」(別名「int」) から「SomeRandomObject」へのキャストは、ARC では許可されていません。

現在、私たちのアプリケーションでは、(残念ながら) タグ 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()and を使用できます。これは一種の低レベルで、少しハックかもしれませんが、tagプロパティをオーバーロードするよりは確かに少ないです。

于 2012-04-12T19:30:15.730 に答える
2

あなたが求めていることを行うための標準的な方法があるかどうかはわかりませんがUITextFieldFieldプロパティでサブクラス化できます。

または、いくつかNSDictionaryのを持ち、プロパティ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 に答える