0

我的视图控制器类中有一个动态类型的成员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.

恐怕我对动态类型有一个基本的误解,但我希望它更简单。

4

1 回答 1

0

你的setter的一些问题:(1)释放ivar时不要调用getter(self.currentEvent),(2)在释放旧obj之前总是保留新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]]) {
   ...
于 2010-06-29T15:54:53.857 回答