2010-08-14 4 views
16

저는 iOS 개발에 익숙하며 헤더 파일에 문제가 있습니다. 헤더 파일에 순환 종속성 문제가 있습니다. 내 didFinishLaunchingWithOptions 방식의 뷰 컨트롤러의 속성 중 하나를 설정해야하기 때문에 내 응용 프로그램 위임 클래스는 이 순환 종속성은 어떻게 해결합니까?

//appDelegate.h  //DISCLAIMER: THIS IS UNTESTED CODE AND WRITTEN ON THE FLY TO ILLUSTRATE MY POINT 
#import <UIKit/UIKit.h> 
#import "MyViewController.h" 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

//appDelegate.m 
@implementation appDelegate 

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    viewController.managedObjectContext = self.managedObjectContext; 
    . 
    . 
    . 
} 
@end 

그리고 내보기 컨트롤러

, 나는 "myFlag"속성을 참조 ..., 내보기 컨트롤러에 대한 포인터를 포함합니다 그건 ... 내 애플 대리자에서의

//MyViewController.h           
#import "appDelegate.h"  //<---circular dependency, causing "Expected specifier-qualifier-list before MyViewController" errors in my appDelegate header file 

@interface MyViewController: UIViewController 
{ 
    NSManagedObjectContext *managedObjectContext; 
} 
@end 

//MyViewController.m 
@import "MyViewController.h" 

@implementation MyViewController 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    ((appDelegate*)[[UIApplication sharedApplication] delegate]).myFlag = NO; 
} 

@end 

하지만 내 애플 대리자에서 "myFlag"속성에 액세스하기 위해, 나는 애플 대리자의 헤더 파일을 가져와야합니다. 이것이 순환 종속성의 원인입니다. 이 문제를 해결하는 방법을 모르는 사람이 있습니까?

미리 도움 주셔서 감사합니다.

+0

+1. 좋은 질문입니다. – iwasrobbed

+0

나는 그것을 사랑한다. \t 도와주세요 5 더 가야 .. – Mel

답변

18

#import "MyViewController.h"appDelegate.h으로하지 마십시오. 대신, 클래스를 앞으로 선언하십시오. 당신이 필요로하는 모든이 구현myFlag 속성을 참조하는 경우

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

또한, 당신은 MyViewController.h#import "appDelegate.h" 할 필요가 없습니다. 대신 MyViewController.m 파일로 가져 오십시오.

1

모든 것을 읽지는 않았지만 @class를 사용하여 전달 선언을 할 수 있습니다. 일반적으로 순환 종속성을 어떻게 해결할 수 있습니까?

2

@class는 당신이 찾고있는 구문 접근법입니다.

대부분의 코더는이 순환 성 (두 방향으로 클래스를 연결합니다. 즉, 뷰 컨트롤러는 응용 프로그램 대리자가 해당 BOOL을 사용하는 상황에서만 사용할 수 있음)을 방지합니다. 당신이 할 수있는 몇 가지 방법이 있습니다 :

  • 이동
  • 뷰 컨트롤러가 싱글로 상태 변수는 대리인이 관찰
  • 키 - 값을 구현하는 인터페이스를 통해 값을 가져가 (이 당신을 응용 프로그램 대리인이보기 컨트롤러에서 구성)

작은 프로젝트의 경우 이러한 종류의 종속성은 실제로 문제가되지 않지만 프로젝트 크기가 커지고 코드 재사용의 필요성이 커지면 기능 분리가 점점 더 중요 해집니다 .

관련 문제