2013-01-18 4 views
0

에서 슈퍼 클래스 속성을 설정 할 수 없음이 간단한 클래스 계층 보자목표 C - 서브 클래스

Tree.h :

@interface Tree : NSObject 
@property (nonatomic, assign) id<TreeDelegate> delegate; 
@end 

Tree.m :

@implementation Tree 
@synthesize delegate; 
@end 

Aspen.h :

,
@interface Aspen : Tree 
- (void)grow:(id<TreeDelegate>)delegate; 
@end 

Aspen.m :

@implementation Aspen 
- (void) grow:(id<TreeDelegate>)d { 
    self.delegate = d; 
} 
@end 

나는, 나는 다음과 같은 오류를 받고 있어요 self.delegate = d;을하려고 :

-[Aspen setDelegate:]: unrecognized selector sent to instance 0x586da00

나는에 Tree 부모 클래스의 delegate 속성을 기다리고 있었다 하위 클래스는 그대로 볼 수 있지만 부모 클래스의 합성 된 setter가 표시되지 않으므로 오류가 나타나지 않는 것처럼 보입니다.

무엇이 누락 되었습니까? 하위 클래스 수준에서 속성을 다시 선언해야합니까? Aspen의 구현 상단에 @dynamic을 추가하려고 시도했지만 작동하지 않았습니다. 이 간단한 개념은 여기 있지만 해결책을 찾기 위해 한 시간을 찾고 있습니다. 이 시점에서 아이디어가 부족합니다.

위의 코드

--EDIT--

은 제가 보는 문제를 설명하기 매우 벗겨 다운 예입니다.

+1

우리는 실제 코드가 필요하다고 생각합니다. 아스펜의'implmentation typo '를 고친 후에, 이것은 잘 동작합니다. – Tim

+0

@Tim Typo가 고정되었습니다. 감사합니다. 그래서 -이게 그대로 작동해야합니까? – Madbreaks

+0

실제 코드를 게시 할 수는 없지만 실제 소스를보다 자세히 반영하기 위해 예제를 업데이트했습니다. – Madbreaks

답변

0

내가 그림을 마지막으로 수 있었다 이거. 내 실제 코드는 제 예제에서 TreeAspen 클래스를 정의하는 타사 정적 라이브러리를 활용합니다. 필자는 예제에서 주어진 Tree delegate이라는 정적 라이브러리의 새 버전을 만들었지 만 프로젝트에 추가 한 라이브러리를 제대로 다시 링크하지 않았기 때문에 런타임에 이전 버전이 여전히 액세스되고있었습니다.

배운 교훈 : 제 3 자 라이브러리를 가져 오는 단계에 부지런히 노력하고 간단한 기본 프로그래밍 개념 (예제 텍스트와 같은)이 작동하지 않을 때 한 걸음 물러서서 내가 점을 찍었는지 확인하십시오. t를 넘어 섰다.

1

나는 단지 프로토콜에 의해 보충 코드가, 객체가 필요한 importmain 기능을 구현하고 내 시스템에이 마법처럼 작동 시도 :

#import <Foundation/Foundation.h> 

@protocol TreeDelegate <NSObject> 
@end 

@interface MyDelegate : NSObject <TreeDelegate> 
@end 

@implementation MyDelegate 
@end 

@interface Tree : NSObject 
@property (nonatomic, assign) id<TreeDelegate> delegate; 
@end 

@interface Aspen : Tree 
- (void)grow:(id<TreeDelegate>)delegate; 
@end 

@implementation Tree 
@synthesize delegate; 
@end 

@implementation Aspen 
- (void) grow:(id<TreeDelegate>)d { 
    self.delegate = d; 
} 
@end 

int main(int argc, char ** argv) { 
    MyDelegate * d = [[MyDelegate alloc] init]; 
    Aspen * a = [[Aspen alloc] init]; 

    [a grow:d]; 
    return 0; 
} 
+0

와우, 알았어. 이것은 적어도 내가 이전에 믿었던 것을 확인해 주며, 이렇게해야한다. 나는 내 코드를 다시 한 번 살펴보고 여기에있는 것과 다른 점을 발견 할 수 있는지 알아볼 것이다. – Madbreaks