Доступ к динамически типизированному члену - PullRequest
0 голосов
/ 29 июня 2010

У меня есть динамически типизированный член id currentEvent в моем классе контроллера представления. Обоснование заключается в том, что контроллер представления используется для отображения данных для двух очень похожих классов моделей.

У меня есть сеттер:

-(void)setCurrentEvent:(id)e {
    [self.currentEvent release];
    Class eventClass = [e class];
    currentEvent = [[eventClass alloc] init];
    currentEvent = [e retain];
}

Теперь я хочу получить доступ к члену класса:

    return [currentEvent.comments count];

Но компилятор жалуется: request for member 'comments' in something not a structure or union.

Боюсь, у меня есть фундаментальное неправильное представление о динамической типизации, но я надеюсь, что это намного проще.

1 Ответ

0 голосов
/ 29 июня 2010

Некоторые проблемы с вашим сеттером: (1) не вызывайте геттер (self.currentEvent) при освобождении ивара, (2) всегда сохраняйте новый obj до освобождения старого obj, в случае это тот же объект, то есть:

-(void)setCurrentEvent:(id)e {
    [e retain];
    [currentEvent release];
    currentEvent = e;
}

Кроме того, я не понимаю, что вы пытаетесь делать с динамической типизацией.

Эта строка вызовет предупреждение компилятора, потому что вы сказали, что currentEvent - это id, у которого нет члена комментариев, поэтому он справедливо жалуется:

return [currentEvent.comments count];

Если каким-то образом вы знаете, что id currentEvent на самом деле является объектом определенного класса, у которого есть комментарии, вы можете преобразовать id в другой тип, чтобы избежать предупреждения:

return [(CommentEvent*)currentEvent.comments count];

Но прежде чем ты это сделаешь, откуда ты знаешь? Вы можете проверить, является ли это правильный класс:

if ([currentEvent isKindOfClass:[CommentEvent class]]) {
   ...
...