0

id currentEventビュー コントローラー クラスに動的に型指定されたメンバーがあります。これは、View Controller を使用して、非常に類似した 2 つのモデル クラスのデータを表示するためです。

私はセッターを持っています:

-(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

セッターに関するいくつかの問題: (1) ivar を解放するときにゲッター (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 に答える