申报

2016-06-30 97 views
1
类别

实例变量我定义了一个类别的NSDictionary申报

的NSDictionary + AddMyFunc.m

// Compiler error: expected identifier or '(' 
@implementation NSDictionary (AddMyFunc) { 
    NSInteger myNum; 
} 

- (void)myFunc { 
    //Compiler error: use of undeclared identifier 'myNum' 
    myNum = //some operation 
} 

@end 

我要定义一个实例变量myNum,我做到了上面的方法,但是我有上面显示的编译器错误。 为什么我得到这些错误,如何摆脱它们?

+0

为什么downvote?我无法在网上找到答案,所以我在这里问,这有什么问题?可能有其他人和我一样有困惑。问题的解释优于低投诉。 –

回答

0

实例变量在类别中不受支持。如果您知道某个实例的实际情况以及分配存储的方式,这是有道理的。

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

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

0

可以使用相关联的对象

#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

您正在尝试使用类扩展注入实例变量与一个类别,其中,该功能不可用的功能类别添加属性。类扩展比类更强大,但不能添加到其他人的类中。

为了补充一点,就像一个实例变量的类的属性,使用相关的对象,像这样:

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

实现:

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

+0

小挑逗。您的解决方案不允许添加实例变量。它可以让你添加一个属性。 – rmaddy

+0

@rmaddy这是一个公平的观察,我编辑,以明确它是一个属性,而不是一个真正的实例变量。谢谢! – dasblinkenlight