2010-08-14 161 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 2010-08-15 01:06:19

+0

我喜歡它。 \t 幫助 5更多去.. – Mel 2011-05-18 23:52:54

回答

18

請勿#import "MyViewController.h"appDelegate.h。相反,前向宣佈這個班級。

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

而且,你不要,如果你需要的是引用的實施myFlag財產需要#import "appDelegate.h"MyViewController.h。相反,將其導入MyViewController.m文件。

1

沒有讀取所有內容,但可以使用@class進行前向聲明。通常我如何解決循環依賴。

2

@class是您正在查找的語法方法。

許多編碼人員都希望避免這種循環(這會將您的類耦合到兩個方向,這意味着您的視圖控制器只能在應用程序委託具有該BOOL的情況下使用)。有幾個方法可以做到這一點:

  • 移動狀態變量的單
  • 有視圖控制器獲取通過委託實現了
  • 鍵 - 值觀察的接口值(您應用程序的委託將配置您的視圖控制器)

對於小型項目這種依賴可能不是一個真正的問題,但隨着項目規模的增長和代碼重用的可取性的增長,清潔的功能分離變得越來越有價值。