Как я разрешаю эту круговую зависимость?

Я плохо знаком с разработкой 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" свойству в моем делегате приложения, я должен импортировать заголовочный файл делегата приложения. Это - то, что вызывает круговую зависимость. Не уверенный, как разрешить это, кто-либо столкнулся с этим?

Заранее спасибо за Вашу справку!

16
задан BeachRunnerFred 14 August 2010 в 22:09
поделиться

3 ответа

Не #import "MyViewController.h" в appDelegate.h. Вместо этого объявите класс.

@class MyViewController;

@interface appDelegate

     NSManagedObjectContext *managedObjectContext;

     MyViewController *viewController;
     BOOL myFlag;

@end

Также не нужно #import "appDelegate.h" в MyViewController.h, если все, что вам нужно, это ссылаться на свойство myFlag в implementation. Вместо этого импортируйте его в файл MyViewController.m.

18
ответ дан 30 November 2019 в 22:09
поделиться

Не все прочитал, но вы можете делать форвардные объявления с помощью @class. Обычно, как я решаю круговые зависимости.

1
ответ дан 30 November 2019 в 22:09
поделиться

@class - это синтаксический подход, который вы ищете.

Многие программисты стараются избежать этой замкнутости (которая связывает ваши классы в двух направлениях, что означает, что ваш контроллер представления может использоваться только в тех случаях, когда делегат приложения имеет этот BOOL). Есть несколько способов сделать это:

  • Переместить переменную состояния в одноэлемент.
  • Попросить контроллер представления получить значение через интерфейс, который реализует делегат.
  • Наблюдение за значением ключа (которое делегат вашего приложения мог бы configure на вашем контроллере представления)

Для небольших проектов такая зависимость, вероятно, не является проблемой, но по мере роста размера проекта и роста желательности повторного использования кода чистое функциональное разделение становится все более и более ценным.

2
ответ дан 30 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: