访问动态类型的成员

时间:2010-06-29 15:22:20

标签: objective-c dynamic typing

我的视图控制器类中有一个动态类型成员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 :(得分:0)

你的setter的一些问题:(1)在释放ivar时不要调用getter(self.currentEvent),(2)在释放旧的obj之前总是保留新的obj ,in case它是相同的obj,即:

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

除此之外,我不明白你尝试用动态打字做什么。

这一行会引发编译器警告,因为你告诉它currentEvent是一个id,它没有comments成员,所以它正确地抱怨:

return [currentEvent.comments count];

如果你知道id currentEvent实际上是具有注释的特定类的对象,你可以将id转换为另一种类型以避免警告:

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

但在你这样做之前,你怎么知道的?您可以查看它是否是正确的类:

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