基础课的扩展

时间:2013-06-12 09:19:33

标签: ios objective-c macos cocoa-touch cocoa

由于基础类(比如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的

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

2 个答案:

答案 0 :(得分:4)

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

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

这里给出了很好的解释,讨论和解释:What is objc_setAssociatedObject() and in what cases should it be used?

答案 1 :(得分:2)

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