2011-10-25 4 views
5

私はカテゴリを使用し、UIViewにいくつかの変数を格納します。id型変数ではないオブジェクトを格納する方法は、objc_getAssociatedObject/objc_setAssociatedObjectを使用しますか?

だけIDの種類を格納し、私は本当にどれもIDタイプたい(ダブル、int型、floatを、炭...など)

どのようにコードを書くには?

#import <UIKit/UIKit.h> 
#import <objc/runtime.h> 

@interface UIView (CountClip) 
@property (nonatomic, copy) NSString *stringTag; 
@property (nonatomic) float offsetY; 
@end 

#import "UIView+CountClip.h" 

@implementation UIView (CountClip) 

static NSString *kStringTagKey = @"StringTagKey"; 

- (NSString *)stringTag 
{ 
    return (NSString *)objc_getAssociatedObject(self, kStringTagKey); 
} 
- (void)setStringTag:(NSString *)stringTag 
{ 
    objc_setAssociatedObject(self, kStringTagKey, stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC); 
} 

- (float)offsetY 
{ 
    // how to write a correct code? 
    return objc_getAssociatedObject(self, <#what is a code?#>); 
} 

- (void)setOffsetY:(float)offsetY 
{ 
    // how to write a correct code? 
    objc_setAssociatedObject(self, <#what is a code?#>,...); 
} 

@end 

答えて

16

あなたはのNSNumberインスタンスおよびその逆に山車を変換する必要があります:NSValueクラスを見て、そのようCGPointCGRectまたはCGSizeなどの変数を格納するに

static NSString *kOffsetYTagKey = @"OffsetYTagKey"; 

- (float)offsetY 
{ 
    // Retrieve NSNumber object associated with self and convert to float value 
    return [objc_getAssociatedObject(self, kOffsetYTagKey) floatValue]; 
} 

- (void)setOffsetY:(float)offsetY 
{ 
    // Convert float value to NSNumber object and associate with self 
    objc_setAssociatedObject(self, kOffsetYTagKey, [NSNumber numberWithFloat:offsetY], OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
+0

完璧に回答!ありがとうございました^^、素敵な一日を! –

0

:適切なメソッドを使用します

NSValue *value = ...; 
CGPoint point = value.CGPointValue; 
CGRect rect = value.CGRectValue; 
CGSize size = value.CGSizeValue; 

FYI:

関連オブジェクトは、この可能性の設定となってはるかに高速道:

objc_setAssociatedObject(self, @selector(stringTag), stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC); 
objc_getAssociatedObject(self, @selector(stringTag)); 

この

その後経由して戻ってそれを変換あなたはkStringTagKey変数を作成する必要はありません。

関連する問題