Как мне разрешить эту круговую зависимость? - PullRequest
16 голосов
/ 15 августа 2010

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

Заранее спасибо за помощь!

Ответы [ 3 ]

18 голосов
/ 15 августа 2010

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

@class MyViewController;

@interface appDelegate

     NSManagedObjectContext *managedObjectContext;

     MyViewController *viewController;
     BOOL myFlag;

@end

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

2 голосов
/ 15 августа 2010

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

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

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

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

1 голос
/ 15 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...