2010-06-29 8 views
0

동적으로 형식이 지정된 멤버 id currentEvent이 내 View Controller 클래스에 있습니다. 뷰 컨트롤러는 매우 유사한 두 모델 클래스의 데이터를 표시하는 데 사용된다는 이론적 근거가 있습니다.동적 유형 지정 멤버에 액세스

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

'currentEvent' 속성을 어떻게 선언 했습니까? 또한 게시 한 코드에 끔찍한 메모리 누출이 있습니다. 소유 한 객체를'currentEvent'에 할당 한 다음 즉시'e'를 사용하여 그것을 덮어 씁니다. –

답변

0

ivar를 릴리스 할 때 getter (self.currentEvent)를 호출하지 마십시오. (2) 새 obj가 항상 인 채로 이전에 이전 obj를 해제하십시오. 동일한 객체 (예 :

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

그렇다면 동적 입력과 관련하여 어떤 조치를 취하고 있는지 이해할 수 없습니다.

당신이 currentEvent는 의견 구성원이없는 아이디이라고 그것을 말 했어요, 그래서 당연히 불만 때문에 컴파일러 경고가 발생합니다이 줄 :

return [currentEvent.comments count]; 

을 당신은 알고 어떻게 든 경우

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

하지만 그렇게하기 전에, 당신은 어떻게 알 수 있습니까 : 아이디 currentEvent은 실제로 당신이 경고를 피하기 위해 다른 유형 ID를 캐스팅 할 수있는 의견이있는 특정 클래스의 목적은? 올바른 클래스인지 확인할 수 있습니다 :

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

세터에게 고맙습니다. 나는 내가 원하고 필요로하는 대부분의 것들을 성취 할 수있는 시점에 있지만, 때로는 내가 생각하는 목표 -C 개념에 대한 기본적인 이해가 부족하다는 느낌을 받는다. 동적 타이핑에서 거의 같은 코드를 두 번 쓰는 것을 피하려고했지만 유사한 두 클래스로 돌아가서 다시 작성하여 동일한 클래스를 사용할 수있게하는 것이 훨씬 낫다는 것을 깨달았습니다. 두 가지 유형의 객체. 'isKindOfClass' 제안을 주셔서 감사합니다. – mvexel

관련 문제