target c xcode 4.0.2: подкласс не может получить доступ к переменным суперкласса "не был объявлен в этой области" - PullRequest
1 голос
/ 18 июня 2011

У меня есть несколько классов, которые являются подклассами одного класса Layer .. по какой-то причине один из подклассов действует по-другому. это урезанная версия:

@interface Layer: CCLayer
{
 GameScene* _scene;
 CCNode* _layerNode;
}
@end

#import "Layer.h"
@interface UILayer: Layer
{
}
@end

@implementation UILayer
-(void) doStuff
{
  [_layerNode addChild:[CCNode node]];  <---gives compile error: "_layerNode was not declared in this scope"
  [_scene playSound];<------gives compile error: "_scene was not declared in this scope"
}
@end

Я думаю, что это дает основную идею. Я могу это исправить, выполнив

[[_self _layerNode] addChild:[CCNode node]];
[[_self _scene] playSound];

но что я не могу понять, так это то, почему другие подклассы Layer могут напрямую обращаться к _layerNode и _scene? Я предполагаю, что это проблема с настройками сборки. В дальнейшем эта проблема возникает только тогда, когда я создаю ее для устройства (iphone), а не для симулятора. дайте мне знать, если вам нужна дополнительная информация, чтобы ответить.

Edit:

Ой, я написал это неправильно. Это должен был быть [[self _layerNode] addNode:[CCNode node]], но я предполагаю, что вопрос заключается в том, почему один подкласс имеет прямой доступ к ivar _layerNode, а другой должен иметь к нему доступ с помощью [self _layerNode]. Как будто UILayer не может найти заголовок суперкласса

Ответы [ 3 ]

1 голос
/ 05 августа 2011

Из документов: Язык программирования Apple Objective-C (больше об этом не упоминается, но вы можете найти его в этом устаревшем документе ) .

Переменная экземпляра доступна в классе, который ее объявляет, и в классах, которые ее наследуют.Все переменные экземпляра без явной директивы области действия имеют область видимости @protected.

Однако к общедоступной переменной экземпляра можно обращаться в любом месте, как если бы это было поле в структуре языка Си.Например:

Worker *ceo = [[Worker alloc] init];

ceo->boss = nil;

У меня ошибка компиляции с использованием LLVM GCC 4.2 (для проекта iOS на устройстве):

ошибка: 'fooInstanceVar' необъявлена ​​(первое использование в этой функции) и та же самая с использованием GCC 4.2: ошибка: 'fooInstanceVar' необъявлена ​​(первое использование в этой функции)

Я могу скомпилировать, используя LLVM Compiler 2.0 без ошибки.

Для компиляции с LLVM GCC 4.2 и GCC 4.2 с использованием self->:

[NSArray arrayWithObjects:self.barProperty, self->fooInstanceVar, nil]; в doSomethingWithProperty метод.

0 голосов
/ 18 июня 2011

Если вы @synthesize ivars, компилятор бесполезно мешает вам получить к ним доступ "напрямую". Исправление относительно просто: напишите self->_layerNode и self->_scene.

Полагаю, ваша "урезанная версия" скомпилирована нормально.

Обратите внимание, что это также плохая форма прямого доступа к ивару вашего суперкласса, если вы не знаете подробностей его реализации.

(Что такое _self?)

0 голосов
/ 18 июня 2011

Может быть, это имя.Префикс «UI» предназначен для классов UIKit.Вполне возможно, что UILayer - это частный класс UIKit, используемый Apple.

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