在类别中声明实例变量

时间:2016-06-30 11:03:49

标签: ios objective-c objective-c-category

我为NSDictionary定义了一个类别

的NSDictionary + AddMyFunc.m

[Account Id] = ParentFieldValue ("Account Id")

我想定义一个实例变量 // Compiler error: expected identifier or '(' @implementation NSDictionary (AddMyFunc) { NSInteger myNum; } - (void)myFunc { //Compiler error: use of undeclared identifier 'myNum' myNum = //some operation } @end ,我是以上面的方式完成的,但是上面显示了编译器错误。 为什么我会得到这些错误,如何摆脱它们?

3 个答案:

答案 0 :(得分:1)

您可以使用关联对象

向属性添加属性
#import <objc/runtime.h> 

static const void *ImageTagKey = &ImageTagKey;

@implementation UIImage (Tagged)

- (void)setTag:(NSSting *)tag
{
    objc_setAssociatedObject(self, ImageTagKey, tag, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)tag
{
    return objc_getAssociatedObject(self, ImageTagKey);
}

@end

答案 1 :(得分:1)

您正尝试使用类别注入实例变量的类扩展功能,此功能不可用。类扩展比类别更强大,但它们不能添加到其他人的类中。

为了将类似实例变量的属性添加到您的类别,请使用关联的对象,如下所示:

@interface NSDictionary (AddMyFunc)
@property (nonatomic, assign) NSNumber *myNum;
@end

实现:

NSString * const kMyNumKey = @"MyNumKey";

@implementation NSDictionary (AddMyFunc)

- (void)setMyNum:(NSNumber*)n {
    objc_setAssociatedObject(self, kMyNumKey, n, OBJC_ASSOCIATION_ASSIGN);
}

- (NSNumber*)myNum {
    return objc_getAssociatedObject(self, kMyNumKey);
}

@end

此属性不是真正的实例变量,因此您无法使用指针->语法来访问它。但是,点语法和方括号语法都可用。

答案 2 :(得分:0)

类别不支持实例变量。如果你知道一个实例究竟是什么,以及如何分配存储,这是有道理的。

因为类别可以按任何顺序加载,所以编译器和链接器无法知道实例变量的地址是什么。

如果您需要模仿属性,请使用关联的对象。