【问题标题】:How to store not id type variable use a objc_getAssociatedObject/objc_setAssociatedObject?如何使用 objc_getAssociatedObject/objc_setAssociatedObject 存储非 id 类型变量?
【发布时间】:2016-01-31 03:15:59
【问题描述】:

我使用一个类别,以及一些存储在 UIView 中的变量。

但只有存储的 id 类型,所以我真的不想要任何 id 类型(int、float、double、char...等等)

如何编写代码?

#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

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    您需要将浮点数转换为 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);
    }
    

    【讨论】:

      【解决方案2】:

      要存储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;
      

      仅供参考:

      设置和获取关联对象的更快方法可能是:

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

      这样您就不必创建kStringTagKey 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多