2012-04-12 6 views
1

私はARC(自動参照カウント)に私のObjective Cコードを変換忙しい、そして次の問題に遭遇した: 'NSInteger'(別名 'INT')のIOS Objective CのARC変換問題

キャストSomeRandomObject」へ'はARCで許可されていません。

私たちのアプリケーションでは、(残念ながら)タグNSIntegerプロパティを使用しています。 UITextField、UISwitchなどにあり、オブジェクトをコントロールにリンクします。

コードは、あなたは、単にこれを達成するためのより良い/より標準的な方法だろうこれは何

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

を行うことができますイベントに達するすっごく

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

答えて

3

より良い方法は、UITextFieldをサブクラス化し、必要なプロパティを追加することです。クラスを制御できないオブジェクトにプロパティを絶対に追加する必要がある場合は、objc_setAssociatedObject()とフレンドを使用できます。これは低レベルのもので、ちょっとハッキリですが、確かにtagプロパティのオーバーロードよりも少なくなります。

+0

たぶん私も、カテゴリを使用して行うことができます何か? – Helix

+0

@Helix:カテゴリを 'objc_setAssociatedObject()'と組み合わせて使うことも、カテゴリ内にUITextField-> Field関連の静的なNSMutableDictionaryを持たせることもできますが、カテゴリは基本的にはソリューション上の「もっと良い」インターフェースになります。本当に問題自体を解決することはできません。 (私がNSDictionaryの解決策について言及しなかったのは、 'objc_setAssociatedObject()'を推奨するものが本当にないと思っていて、かなり複雑です。) – Chuck

+0

はい、NSDictionaryの解決策不要な複雑さ – Helix

1

チャックが以前に投稿したものよりも正しいものを追加する。あなたは後にしているものを行うための標準的な方法があれば

- (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); 
} 
+0

を覚えておいてください。Field to NSNumber – Arvin

+1

いいえ、問題は、オブジェクトの型をオブジェクト以外の型にARCで格納することを想定していないということです。コンパイラは、オブジェクトを早期にリリースする可能性があります。 – Chuck

+0

これは決してうまくいかないので、nsnumberポインタは数字の – Dani

2

私はわからないんだけど、あなたはFieldプロパティでUITextFieldのサブクラスを作成できます。

あなたがNSObjectの上のカテゴリを追加することができます。

また、をFieldに設定し、tagプロパティに固有の識別子を使用することもできます。 @Chuckはここで、話していたものの一例として、

+0

どちらもオプションです。私のオブジェクト間の関係を維持する – Helix

2

は、カテゴリを使用してそのようなことの簡単な実装です:

@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