Переменная Objective-C с несколькими разрешениями - PullRequest
0 голосов
/ 31 октября 2010

У меня есть модель данных, которая похожа на эту:

                                          (in another project)
 ________________________________        _______________________
|                                |      |                       |
|  Graph                         |      | DetailedGraph         |
|  GraphListener lstnr           |      | (needs to access foo) |
|  NSString foo                  | <----|_______________________|     
|  ____________________________  | 
| | GraphListener              | |       _______________________
| | Graph enclosing            | |      |                       |
| | (also needs to access foo) | |      | OtherClass            |
| |____________________________| |      | (cannot access foo)   | 
|________________________________|      |_______________________|

Теперь моя проблема в том, что GraphListener должен быть внутренним классом, что нельзя сделать в objc, поэтому у меня есть эторешение:

@interface Graph_Listener
{
     @private
     Graph *enclosing;
}
@end

@interface Graph
{
    @package
    NSString *foo;
} 
@end

Теперь моя проблема в том, что когда я перехожу к подклассу Graph и создаю класс DetailedGraph, который находится в другом проекте и по-прежнему требует доступа к foo, какможно ли это сделать (я бы предпочел не использовать свойства, потому что переменная foo не должна быть доступна за пределами GraphListener и DetailedGraph.

1 Ответ

1 голос
/ 31 октября 2010

Во-первых, я надеюсь, что ваши два класса наследуются от NSObject и не являются корневыми классами.Создание нового корня в Objective-C на iOS на самом деле довольно сложно, если вы не держите свои экземпляры полностью в изоляции от Foundation / UIKit.

Два возможных решения:

  • Донне получить доступ к iVar напрямую.Сделайте и используйте аксессоры, вероятно, через директиву @property.Это «более правильное» решение в том смысле, что класс, реализованный в библиотеке A, скорее всего, не должен выводить ivars класса из библиотеки B напрямую.Прохождение через средство доступа лучше сохраняет инкапсуляцию и признает, что прямой доступ к iVar является чрезвычайно нетипичным шаблоном в Objective-C (в основном ограничивается только классом, напрямую обращающимся к его собственным iVars).iVars, чтобы быть @public и расстраиваться.Хрупкие, нетипичные и чреватые опасностями.

Приватное в Objective-C действительно означает "что модуль компиляции там не может видеть это объявление здесь".

Таким образом, если вы хотите, вы можете объявить свойство, скажем, как общедоступное чтение и частное чтение:

Foo.h:

@interface Foo....
@property(readonly) int x;
@end

Foo+ Private.h:

@interface Foo()
@property(readwrite) int x;
@end

Foo.m: #import "Foo + Private.h" @implementation Foo @synthesize x;@ end

Все, что импортирует Foo.h, увидит только то, что x только для чтения.Реализация Foo увидит, что это readwrite.Как и все, что импортирует Foo + Private.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...