如何解决此循环依赖?

时间:2010-08-14 22:09:36

标签: iphone ipad ios

我是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”属性,这是我的app委托...

//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

但是为了访问我的app委托中的“myFlag”属性,我需要导入app delegate的头文件。这就是导致循环依赖的原因。不确定如何解决这个问题,有没有人遇到过这个问题?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:18)

#import "MyViewController.h"中不要appDelegate.h。相反,向前声明该类。

@class MyViewController;

@interface appDelegate

     NSManagedObjectContext *managedObjectContext;

     MyViewController *viewController;
     BOOL myFlag;

@end

此外,如果您只需要引用实施中的#import "appDelegate.h"属性,则MyViewController.hmyFlag不需要MyViewController.m。而是将其导入{{1}}文件。

答案 1 :(得分:2)

@class是您正在寻找的语法方法。

许多程序员都希望避免这种循环(将你的课程分成两个方向,这意味着你的视图控制器只能在app委托具有BOOL的情况下使用)。有几种方法可以做到这一点:

  • 将状态变量移至单件
  • 让视图控制器通过委托实现的接口
  • 获取值
  • 键值观察(您的应用代表将在您的视图控制器上配置)

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

答案 2 :(得分:1)

没有阅读所有内容,但您可以使用@class进行转发声明。通常我如何解决循环依赖。