Доступ к закрытым переменным класса в другом проекте - PullRequest
0 голосов
/ 13 мая 2019

У меня огромный проект Objective-C, который я хочу разделить на несколько в одном рабочем пространстве.Первоначально я сделал это, и код скомпилирован хорошо, но я решил также перенести одну категорию большого класса в другой проект, и теперь компоновщик не понимает ситуацию:

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 скомпилирован в MyLib.framework, который используется в MyApp.Как я уже сказал, до перехода MyClass+Viz в проект MyApp вся сложная логика работала правильно, поэтому проблем со связыванием проектов, вероятно, нет.Кроме того, я дважды проверил, что все файлы правильно помечены в Этапы сборки раздел настроек.

Это файл MyClass.h:

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

ЭтоMyClass+Inner.h file:

#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 голосов
/ 13 мая 2019

Во-первых, вы должны использовать @property, а не переменные экземпляра, как правило.

Во-вторых, вы должны сделать что-то подобное, используя несколько заголовочных файлов и расширений классов.

Как правило,

MyClass.h MyClass_Internal.h MyClass.m MyClass_Internal.m (обычно не используется)

MyClass.m импортирует оба заголовка.MyClass.h будет определять открытый интерфейс, а MyClass_Internal.h будет иметь расширение класса для обеспечения частного интерфейса:

@interface MyClass()
@property(...) Thing *internalThing;
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...