我的视图控制器类中有一个动态类型成员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
。
恐怕我对动态类型有一个基本的误解,但我希望它更简单。
答案 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]]) {
...