如何解决这种循环依赖?

Posted

技术标签:

【中文标题】如何解决这种循环依赖?【英文标题】:How do I resolve this circular dependency? 【发布时间】:2010-08-14 22:09:35 【问题描述】:

我是 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”属性,我需要导入应用委托的头文件。这就是导致循环依赖的原因。不知道怎么解决,有人遇到过吗?

提前感谢您的帮助!

【问题讨论】:

我喜欢它。帮助 5 人去.. 【参考方案1】:

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

@class MyViewController;

@interface appDelegate

     NSManagedObjectContext *managedObjectContext;

     MyViewController *viewController;
     BOOL myFlag;

@end

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

【讨论】:

【参考方案2】:

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

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

将状态变量移至单例 让视图控制器通过委托实现的接口获取值 Key-Value Observing(您的应用委托将在您的视图控制器上配置)

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何解决这种循环依赖?的主要内容,如果未能解决你的问题,请参考以下文章

深谈Spring如何解决Bean的循环依赖

Spring循环依赖原理分析

面试题:如何解决Spring 的循环依赖问题

Spring是如何解决循环依赖的?

彻底理解Spring如何解决循环依赖

如何正确处理 Python 中的循环模块依赖关系?