Ios 在类别中声明实例变量

Ios 在类别中声明实例变量,ios,objective-c,objective-c-category,Ios,Objective C,Objective C Category,我为NSDictionary定义了一个类别 NSDictionary+AddMyFunc.m // Compiler error: expected identifier or '(' @implementation NSDictionary (AddMyFunc) { NSInteger myNum; } - (void)myFunc { //Compiler error: use of undeclared identifier 'myNum' myNum = //som

我为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
,我是用上面的方法定义的,但是上面显示了编译器错误。
为什么会出现这些错误,如何消除它们?

类别中不支持实例变量。如果您知道实例实际上是什么,以及存储是如何分配的,那么这是有意义的

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


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

您可以使用关联对象将属性添加到类别中

#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
#导入
静态常量void*ImageTagKey=&ImageTagKey;
@实现UIImage(已标记)
-(void)setTag:(NSSting*)标记
{
objc_setAssociatedObject(self、ImageTagKey、tag、objc_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString*)标记
{
返回objc_getAssociatedObject(self,ImageTagKey);
}
@结束
您试图使用将实例变量注入类别的类扩展功能,但该功能不可用。类扩展比类别更强大,但它们不能添加到其他人的类中

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

@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

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

为什么要进行向下投票?我在网上找不到答案,所以我在这里问,这有什么问题?可能还有其他人和我一样困惑。对这个问题的解释总比否决要好。小题大做。您的解决方案不允许您添加实例变量。它允许您添加一个属性。@rmaddy这是一个公平的观察,我编辑它是为了明确它是一个属性,而不是一个真正的实例变量。谢谢