2011-10-25 33 views
5

我使用一個類別,以及一些存儲在UIView中的變量。如何存儲不是id類型變量使用objc_getAssociatedObject/objc_setAssociatedObject?

但只存儲ID類型,所以我真的希望沒有ID類型(整型,浮點,雙焦...等)

如何寫代碼?

#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的情況下,反之亦然:

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

要存儲的變量,如CGPointCGRectCGSize,看看NSValue類使用適當的方法:

NSValue *value; 
value = [NSValue valueWithCGPoint:point]; 
value = [NSValue valueWithCGRect:rect]; 
value = [NSValue valueWithCGSize:size]; 

然後將其轉換回經:

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變量。