Проблемы со ссылками на iVar во внутреннем классе - PullRequest
2 голосов
/ 30 марта 2012

У меня есть класс с именем MyClass, который имеет небольшой вложенный внутренний класс с именем MyInnerClass. Файл реализации выглядит следующим образом (и также содержит ivar вложенного внутреннего класса):

@class MyInnerClass;

@interface MyClass
{
MyInnerClass *myInnerClassIvar;
}
@property(nonatomic, retain) MyInnerClass *myInnerClassIvar;

@end

Затем в файле реализации я реализую MyClass и MyInnerClass. Похоже на следующее:

@interface MyInnerClass
{
iVar *x;
}

@property(nonatomic, retain) iVar *x;
@end

@implementation MyInnerClass
@synthesize x;
...
@end

@implementation MyClass
@synthesize myInnerClassIvar;
...
@end

Я сейчас создаю подкласс для MyClass, и в нем я пытаюсь сделать вызов, подобный этому:

self.myInnerClassIvar.x

И я получаю следующее сообщение:

Property x cannot be found in in forward class object MyInnerClass *

Я что-то забыл? Раньше не реализовывал внутренний класс, не вижу причин, почему это не должно работать.

ОБНОВЛЕНО: я переместил интерфейс MyInnerClass в .h MyClass, и все работает. Это хорошее решение?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Я считаю, что Objective-C не имеет внутренних классов в том смысле, в котором вы пытаетесь его реализовать. См. SO . Но по поводу твоего вопроса ...

в MyClass.h нет упоминания об iVars MyInnerClass - это прямое определение, т.е. @class MyInnerClass, поэтому MySubClass не имеет контрольной точки для x.

Если вы определили два класса MyClass и MyInnerClass (вероятно, нехорошо назвать это, учитывая ...) - имейте их в двух отдельных файлах .h и двух отдельных файлах .m (т.е. как обычно). Сделайте @property в MyClass типа MyInnerClass. Затем в MySubClass необходимо импортировать как MyClass, так и MyInnerClass.

0 голосов
/ 30 марта 2012

Я переместил интерфейс MyInnerClass в .h файл MyClass, как показано ниже:

MyClass.h

@class MyInnerClass;

@interface MyClass
{
MyInnerClass *myInnerClassIvar;
}
@property(nonatomic, retain) MyInnerClass *myInnerClassIvar;

@end

@interface MyInnerClass
{
iVar *x;
}

@property(nonatomic, retain) iVar *x;
@end

Я подожду, прежде чем отмечу это как ответИсходя из предыдущего ответа, я знаю, что есть некоторый скептицизм.Единственная причина, по которой я попытался это сделать, заключается в том, что я видел это в примере Apple SimpleTextInput, за исключением того, что весь внутренний класс находится в файле .m.В любом случае, было бы интересно услышать, что люди скажут по этому поводу, если это может привести к нежелательным побочным эффектам позже или если все в порядке.

...