Ios 在类别中声明实例变量
我为NSDictionary定义了一个类别 NSDictionary+AddMyFunc.mIos 在类别中声明实例变量,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
// 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这是一个公平的观察,我编辑它是为了明确它是一个属性,而不是一个真正的实例变量。谢谢