2009-07-13 2 views
5

iPhone 앱을 개발 중이며 Objective-C와 class.h 및 class.m 구조가 새로 도입되었습니다.Objective-C의 두 클래스 사이에서 참조를 어떻게 가질 수 있습니까?

이제 두 클래스 모두 다른 클래스의 변수를 가져야합니다. 그러나 그것은 불가능한 것 같습니다.

class1.m (또는 class2.m)에 class1.h가 포함되어 있고 class2.h가 포함 된 경우 class2.h를 포함하고 class1.h를 포함하면 class1.h에 class2 변수를 선언 할 수 없습니다. , 나는 class2.h에서 class1 변수를 선언 할 수 없다.

내 아이디어가있어 주길 바래. 이것을 성취하는 것이 정말로 불가능합니까?

감사합니다.

+4

이것은 아마도 당신이 찾고있는 것일 수 있습니다 : http://stackoverflow.com/questions/322597/objective-c-class-vs-import – teabot

답변

20

@class 키워드를 사용하여 헤더 파일에서 클래스를 전달 선언 할 수 있습니다. 이렇게하면 #import 헤더 파일을 사용하지 않고도 클래스 이름을 사용하여 인스턴스 변수를 정의 할 수 있습니다.

Class1.h

@class Class2; 

@interface Class1 
{ 
    Class2 * class2_instance; 
} 
... 
@end 

Class2.h 여전히하는 .m 파일에 #import에 적절한 헤더 파일이있을 것이다

@class Class1; 

@interface Class2 
{ 
    Class1 * class1_instance; 
} 
... 
@end 

+1

+1 사실, 어떤 사람들은 자신의 코드. 일반적으로 헤더에 클래스 유형 이름 (변수, 매개 변수 및 반환 유형의 경우) 만 필요하기 때문에 가져 오기 체인을 단순화하고 모든 헤더 파일을 더 빠르게 처리 할 수 ​​있습니다. 확실히 질문 바로 아래에 제공된 SO 링크 @teabot을 확실히보십시오. –

+0

@Quinn Taylor : 좋은 지적입니다. 상속을 위해 필요한 경우를 제외하고는 내 헤더 파일에서'# import'를 거의 사용하지 않습니다. –

+0

감사합니다. 그러나 모든면에서 효과가있는 것은 아닙니다. 나는 그것을 사용할 때이 메시지를 받는다. "경고 : 수신자"Class2 "는 전달 클래스이며 해당 @interface가 존재하지 않을 수 있습니다." 그리고 그 중 하나의 구성 요소에 액세스하려고하면 해당 구성 요소가 존재하지 않는다는 오류가 발생합니다. 적절한 헤더를 통해 자신의 헤더를 의미합니까? 또는 둘 다? – treznik

3

순환 종속성은 종종 디자인 문제를 나타냅니다. 아마도 수업 중 하나 또는 둘 다 너무 많은 책임이 있습니다. 순환 종속성에서 나타날 수있는 리팩토링은 상호 의존적 인 기능을 두 고유 클래스가 모두 사용하는 자체 클래스로 이동시키는 것입니다.

각 클래스가 다른 클래스에서 필요로하는 기능을 설명해 주실 수 있습니까?

+0

음. 기본적으로 Class1은 외부 이미지를 비동기 적으로로드하는 스크립트를 실행하는 Class2의 인스턴스를 만들고 이미지가로드되면 Class1의 메서드를 실행해야하는 Class2의 메서드가 실행됩니다. 결국 왜 내가 Class2를 필요로하는지 궁금해 할 것입니다. 거기에 이미지로드 외에 추가 된 기능이 있기 때문에 필요할 것입니다. 흠, 방금 깨달았습니다. Class1 참조를 유형으로 저장할 수 있습니까? – treznik

+0

델리게이트 또는 이벤트에 대한 작업과 같습니다. Class2는 특히 Class1이 이미지로드 완료를 염려 할 필요가 없다는 것을 알 필요가 없습니다. 단지 그것에 대해 알고 싶은 다른 사람들이 있습니다.Class2는 이미지로드가 완료 될 때 발생하는 이벤트/알림을 노출해야합니다. 소비자는 알림이 발생할 때 구독 및 선택 방법을 결정해야합니다. –

+2

다음은 객체간에 느슨하게 결합 된 통신을 구현하는 여러 가지 방법입니다. http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html –

관련 문제