2009-05-07 5 views
4

좋아, 이것은 아주 어리석은 초보자 질문 일지 모르지만, :Objective-C 클래스의 양방향 종속성으로이 문제점을 어떻게 해결할 수 있습니까?

나는 ClassB로부터 자식 객체를 생성하고 그것을 인스턴스 변수에 할당 할 ClassA를 가지고있다. 자세히 : ClassA는 지정된 초기화 프로그램에서 ClassB를 할당하고 초기화하고이를 childObject 인스턴스 변수에 할당합니다. 헤더는 다음과 같습니다.

#import <Foundation/Foundation.h> 
#import "ClassB.h" 

@interface ClassA : NSObject { 
    ClassB *childObject; 
} 

@end 

그런 다음 ClassB 헤더가 있습니다. ClassB는 ClassA에 대한 참조가 있어야합니다.

#import <Foundation/Foundation.h> 
#import "ClassA.h" 

@interface ClassB : NSObject { 
    ClassA *parentObject; 
} 

- (id)initWithClassA:(ClassA*)newParentObject; 

@end 

를 ClassA 객체 ClassB가로부터 자식 오브젝트를 생성

은 다음를 ClassA 객체는 자신 (자기)를 통과해야하는 ClassB가 객체의 지정된 초기화를 호출한다.

나는 뭔가 잘못되었다고 생각하지만, 지금은 정확히 무엇인지 알지 못합니다. 내가 아는 한 가지는 이것이 작동하지 않는다는 것입니다. 그들은 서로를 수입 할 수 없습니다. 컴파일러는 "오류 : 'ClassA'이전 구문 오류가 발생했습니다."라고 알려줍니다. ClassA 가져 오기에 대한 import 문을 제거 할 때 ClassA * parentObject 인스턴스 변수를 제거하고 Classes 참조를 사용하는 지정자 이니셜 라이저를 제거하면 작동합니다.

자, 달성하고자하는 것은 다음과 같습니다. (중요하다면) UIScrollView에서 아주 특별하고 복잡한 동작이 필요합니다. 그래서 서브 클래 싱하기로 결정했습니다. 주요 부분은 대리자 메서드 내에서 수행되기 때문에 UIScrollView의 하위 클래스에 대한 "일반"대리자 개체를 만들기로 결정했습니다. 그런 다음 내 UIScrollView 하위 클래스는 해당 특수 대리자 객체를 자동으로 만들고 해당 대리자 속성에 할당합니다. 대리자 객체 자체는 부모 인 UIScrollView에 대한 참조가 필요하므로 해당 스크롤 뷰의 하위 뷰에 액세스 할 수 있습니다. 하지만 어쨌든,이 문제를 해결할 더 좋은 방법이 있더라도 서로를 필요로하는 두 개의 "상호 의존적 인"객체로 어떻게 그렇게 할 수 있는지 알고 싶습니다.

모든 의견을 환영합니다!

+0

나를 생각 나게합니다. http://stackoverflow.com/questions/820808/objective-c-cocoa-proper-design-for-delegates-and-controllers – Kriem

+0

훌륭하고 훌륭한 질문입니다. 나는 지금 이걸 발견했고 내가 가지고있는 오랜 쟁점에 대한 해답을 얻는다. 모든 위대한 해답을 주셔서 감사합니다! –

답변

15

헤더 파일에서 이러한 클래스를 가져올 필요가 없습니다. 만하는 .m 파일에 # import를 사용하는 다음 헤더 파일에 @class를 사용하여 :

// ClassA.h: 
@class ClassB; 
@interface ClassA : NSObject 
{ 
    ClassB *childObject; 
} 
@end 


// ClassA.m: 
#import "ClassA.h" 
#import "ClassB.h" 
@implementation ClassA 
//.. 
@end 


// ClassB.h 
@class ClassA; 
@interface ClassB : NSObject 
{ 
    ClassA *parentObject; 
} 
- (id)initWithClassA:(ClassA*)newParentObject; 
@end 


// ClassB.m: 
#import "ClassB.h" 
#import "ClassA.h" 
@implementation ClassB 
//.. 
@end 
5

#import 대신 @class A;@class B;을 사용하면 컴파일러에서 클래스 정의를 염려하지 말고 나중에 계속 나타날 것이므로 계속 진행하십시오.

기본적으로 #import "A.h"@class A;으로 대체하십시오.

5

당신이해야 할 일은 전체 정의를 가져 오는 대신 클래스를 "전달 선언"하는 것입니다.예 :

그리고 ClassB 헤더 파일과 비슷한 작업을 수행합니다.

관련 문제