我为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
,我是以上面的方式完成的,但是上面显示了编译器错误。
为什么我会得到这些错误,如何摆脱它们?
答案 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)
类别不支持实例变量。如果你知道一个实例究竟是什么,以及如何分配存储,这是有道理的。
因为类别可以按任何顺序加载,所以编译器和链接器无法知道实例变量的地址是什么。
如果您需要模仿属性,请使用关联的对象。