访问其他项目中类的私有变量

时间:2019-05-13 14:21:52

标签: objective-c xcode oop project

我有一个庞大的Objective-C项目,我想在一个WorkSpace中将其拆分为多个项目。最初,我做到了,并且代码编译良好,但是我决定将大类的一个类别移至其他项目,现在,链接器不了解这种情况:

Undefined symbols for architecture x86_64:
  "_OBJC_IVAR_$_MyClass.data", referenced from:
      -[MyClass(Viz) someTask] in MyClass+Viz.o

d: symbol(s) not found for architecture x86_64  
clang: error: linker command failed with exit code 1 (use -v to see invocation)

简而言之,我的工作区如下:

- MyLib project:
    MyClass.h
    MyClass.m
    MyClass+Inner.h
    MyClass+Inner.m

- MyApp project:
    MyClass+Viz.h
    MyClass+Viz.m

MyLib编译成MyApp中使用的MyLib.framework。正如我所说,在将MyClass+Viz移至MyApp项目之前,所有复杂的逻辑都可以正常工作,因此项目链接可能没有问题。另外,我两次检查了所有文件是否在 Build Phases 设置部分中正确标记。

这是MyClass.h文件:

@interface MyClass : NSObject
- (instancetype)init;
- (void)public_methods;
@end

这是MyClass+Inner.h文件:

#import "MyClass.h"

@interface MyClass ()
{
    // Variables placed here
    // so that only class methods can access them
    SomeStruct* data;
    // other fields ...
}
@end

@interface MyClass (Inner)
- (void)private_methods;
@end

还有MyClass+Viz.m文件:

#import "MyClass+Viz.h"
#import "MyClass+Inner.h"

@implementation MyClass (Viz)
 - (int)someTask {
    return data->length;
    // this or any other stuff with
    // class variables from MyClass+Inner.h
    // leads to "Undefined symbols" by linker
}
@end

如何使它起作用,使链接器从其他项目中查看类的私有变量?

1 个答案:

答案 0 :(得分:0)

首先,通常应该使用@property而不是实例变量。

第二,您将使用多个头文件和类扩展名执行类似的操作。

通常

MyClass.h MyClass_Internal.h MyClass.m MyClass_Internal.m(通常不使用)

MyClass.m将导入两个标头。 MyClass.h将定义公共接口,而MyClass_Internal.h将具有类扩展以提供私有接口:

@interface MyClass()
@property(...) Thing *internalThing;
@end