2010-08-14 130 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的情况下使用)。有几个方法可以做到这一点:

  • 移动状态变量的单
  • 有视图控制器获取通过委托实现了
  • 键 - 值观察的接口值(您应用程序的委托将配置您的视图控制器)

对于小型项目这种依赖可能不是一个真正的问题,但随着项目规模的增长和代码重用的可取性的增长,清洁的功能分离变得越来越有价值。