【问题标题】:Accessing dynamically typed member访问动态类型成员
【发布时间】:2010-06-29 15:22:19
【问题描述】:

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

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

【问题讨论】:

  • 您是如何声明您的currentEvent 属性的?此外,您发布的代码中存在严重的内存泄漏。您将拥有的对象分配给currentEvent,然后立即用保留的e 覆盖它(并泄漏它)。

标签: objective-c dynamic typing


【解决方案1】:

您的 setter 存在一些问题:(1) 在释放 ivar 时不要调用 getter (self.currentEvent),(2) 在释放旧 obj 之前 始终保留新 obj,在如果是同一个obj,即:

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

除此之外,我不明白你想用动态类型做什么。

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

return [currentEvent.comments count];

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

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

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

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

【讨论】:

  • 感谢二传手的更正。我现在可以完成大部分我想要和需要的事情,但有时我仍然觉得我对 Objective-C 概念缺乏一些基本的理解,这导致我对这样的基础知识不太正确。关于动态类型——我试图避免两次编写几乎相同的代码,但意识到我会更好地回到两个相似的类并重写它们,以便我可以为这两个类使用相同的类对象的类型。也感谢isKindOfClass 的建议。
猜你喜欢
  • 2018-10-05
  • 2019-07-13
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多