如何解决这种循环依赖?
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 进行前向声明。通常我如何解决循环依赖。
【讨论】:
以上是关于如何解决这种循环依赖?的主要内容,如果未能解决你的问题,请参考以下文章