2012-03-30 3 views
2

У меня есть класс под названием 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, и все работает. Это хорошее решение?

+1

Вы пытались получить доступ к нему через обозначение скобки ('[myInnerClassIvar x]')? Кроме того, ваши определенные и синтезированные типы различны ('iVar x' и' iVar * x') – Alexander

+0

Доступ к нему через скобу, похоже, работает, хотя он все еще ставит предупреждение: «x устарел». Это просто странно. Что касается того, что синтезированные типы были разными, это было просто ошибкой, когда я печатал ее (я ее исправил). –

+0

Это предупреждение от устаревания странно. – Alexander

ответ

0

я переехал интерфейс 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. В любом случае, было бы интересно услышать, что люди могут сказать об этом, если это может понести нежелательные побочные эффекты позже или если все в порядке.

2

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

в MyClass.h нет упоминания о Иварс из MyInnerClass - это определение вперед, т.е. @class MyInnerClass поэтому MySubClass не имеет точку отсчета для х.

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

+1

Это правильно. Проще говоря, ваша реализация подкласса может видеть только то, что определено в вашем файле .h, и все детали вашего внутреннего класса находятся в файле .m. – jrturton

+0

Я фактически переместил интерфейс MyInnerClass в .h-файл MyClass, и теперь все работает отлично ... просто не знаю, насколько это целесообразно, это LOL –

Смежные вопросы