由于基础类(比如NSString)的.m文件不可用,我在想是否可以在同一个类上声明的类别的.m文件中声明扩展名。我成功地创建了一个不使用任何实例变量的私有方法。但是当我试图访问界面内部声明的iVar时,会导致问题 *这没有这样的目的,只是试一试。
我所做的是在NSString
上声明一个类别:
的NSString + TestInterface.h
@interface NSString (TestInterface)
@end
的NSString + TestInterface.m
@interface NSString () {
NSString *myVar;
}
@property (strong) NSString *myVar;
-(void)myPrivateMethod;
@end
@implementation NSString (TestInterface)
-(void)myPrivateMethod{
myVar=@"random";
// [self setValue:@"check" forKey:@"myVar"];
NSLog(@"Private %@",myVar);
// NSLog(@"Private %@",[self valueForKey:@"myVar"]);
}
@end
当我这样做时,我得到以下编译器错误:
架构x86_64的未定义符号:
“_OBJC_IVAR _ $ _ NSString.myVar”,引自: - NSSTring + TestInterface.o中的[NSString(TestInterface)myPrivateMethod] ld:找不到架构的符号 x86_64的
有人可以告诉我发生了什么吗?
答案 0 :(得分:4)
您不能在不具有该实现(.m文件)的外部类的扩展/类别中添加实例变量。
您当然可以添加充当setter和getter的方法。对于存储实际值,您可以使用objc_setAssociatedObject,它是某种全局存储,您可以将值与键和对象实例相关联。
这里给出了很好的解释,讨论和解释:What is objc_setAssociatedObject() and in what cases should it be used?
答案 1 :(得分:2)
您只能使用类的原始主要实现所在的同一翻译单元(文件)中的类扩展来定义新的实例变量。这意味着您无法有效地添加实例变量到你没有源代码的类。