2010-08-14 34 views
16

Soy nuevo en el desarrollo de iOS y me estoy encontrando con un problema con mis archivos de encabezado. Me encuentro con un problema de dependencia circular con mis archivos de encabezado. Mi clase de aplicación delegado contiene un puntero a mi controlador de vista, ya que tengo que establecer una de las propiedades del controlador de vista en mi método didFinishLaunchingWithOptions ...¿Cómo resuelvo esta dependencia circular?

//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 

Y en mi controlador de vista, me refiero a la propiedad "myFlag" , eso es en mi aplicación delegado ...

//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 

Pero con el fin de acceder a la propiedad "myFlag" en mi aplicación delegado, necesito para importar el archivo de cabecera del delegado de la aplicación. Esto es lo que está causando la dependencia circular. No estoy seguro de cómo resolver esto, ¿alguien se ha topado con esto?

Gracias de antemano por su ayuda!

+0

+1 .. Gran pregunta. – iwasrobbed

+0

Me encanta. \t ayuda 5 más para ir .. – Mel

Respuesta

18

No #import "MyViewController.h" en appDelegate.h. En cambio, reenvía: declara la clase.

@class MyViewController; 

@interface appDelegate 

    NSManagedObjectContext *managedObjectContext; 

    MyViewController *viewController; 
    BOOL myFlag; 

@end 

Además, no es necesario que #import "appDelegate.h" en MyViewController.h si todo lo que necesita es hacer referencia a la propiedad myFlag en el aplicación. En su lugar, impórtelo en el archivo MyViewController.m.

1

No he leído todo, pero puede hacer declaraciones anticipadas con @class. Por lo general, cómo resuelvo las dependencias circulares.

2

@class es el enfoque sintáctico que estás buscando.

Muchos codificadores intentan evitar esta circularidad (que combina sus clases en dos direcciones, lo que significa que su controlador de vista solo puede usarse en circunstancias en las que el delegado de la aplicación tenga ese BOOL). Hay algunas maneras que usted puede hacer esto:

  • Mover la variable de estado a un conjunto unitario
  • Hacer que el controlador de vista traer el valor a través de una interfaz que el delegado implementa
  • valor-clave Observar (que a su aplicación delegado podría configurar en el controlador de vista)

Para proyectos pequeños este tipo de dependencia no es probable que realmente un problema, pero a medida que el tamaño del proyecto crece y la conveniencia de reutilizar el código crece, la separación funcional limpia se vuelve más y más valiosa .

Cuestiones relacionadas