我如何解决这个循环依赖?

我是新的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”属性,我需要导入应用程序委托的头文件。 这是什么导致循环依赖。 不知道如何解决这个问题,有没有人遇到这个?

在此先感谢您的帮助!

请勿在appDelegate.happDelegate.h #import "MyViewController.h" 。 而是向前宣布这个class级。

 @class MyViewController; @interface appDelegate NSManagedObjectContext *managedObjectContext; MyViewController *viewController; BOOL myFlag; @end 

另外,如果您只需要在实现中引用myFlag属性,则不需要在MyViewController.h #import "appDelegate.h" 。 而是将其导入到MyViewController.m文件中。

@class是你正在寻找的语法。

许多编程人员都希望避免这种循环(这会使您的类在两个方向上耦合,这意味着您的视图控制器只能在应用程序委托具有BOOL的情况下使用)。 有几种方法可以做到这一点:

  • 将状态variables移动到一个单例
  • 让视图控制器通过委托实现的接口获取值
  • 键值观测(您的应用程序代理将在您的视图控制器上进行configuration)

对于小型项目来说,这种依赖关系可能并不是一个真正的问题,但是随着项目规模的增长和代码重用的需求的增长,干净的function分离变得越来越有价值。

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