1

由于基础类(比如 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.old 中的 -[NSString(TestInterface) myPrivateMethod]:未找到架构 x86_64 的符号

有人可以告诉我发生了什么吗?

4

2 回答 2

4

您不能在您不拥有其实现(.m 文件)的外部类的扩展/类别中添加实例变量。

您当然可以添加充当 setter 和 getter 的方法。对于实际值的存储,您可以使用 objc_setAssociatedObject ,它是某种全局存储,您可以在其中将值与键和对象的实例相关联。

这里很好地解释、讨论并给出了例子:什么是 objc_setAssociatedObject() 以及在什么情况下应该使用它?

于 2013-06-12T10:07:34.890 回答
2

您只能在类的原始主要实现所在的同一翻译单元(文件)中使用类扩展定义新的实例变量。这意味着您无法有效地将实例变量添加到您没有的类中的源代码。

于 2013-06-12T09:52:19.677 回答