2012-06-19 15 views
6

El problema¿Por qué mi IBOutlet se lanza bajo ARC?

Un IBOutlet se libera antes de que tenga la oportunidad de usarlo.

lo que quiero

Quiero tener acceso a un controlador de navegación desde mi aplicación delegado para que pueda volver a cargar una vista de tabla.

mi configuración

tengo:

  • Un Main.xib que se ha configurado como mi interfaz principal en la configuración de destino
  • Un IBOutlet al controlador de navegación como Ivar en mi aplicación delegado
  • Este IBOutlet conectado al controlador de navegación correcto en Main.xib
  • App Delegate se crea una instancia en th e xib pero no establecen como del propietario del archivo

estoy usando ARC, Xcode 4.3.2 y iOS5.1

lo que he tratado

  • Cambio de destino del despliegue de
  • Poner un punto de ruptura en dealloc para el controlador de navegación, delegado de la aplicación - nunca se llaman
  • Leer todo lo que puedo encontrar en ARC y IBOutlet - nada parece cont radict lo que estoy haciendo
  • Creación de un nuevo proyecto, con sólo las clases mínimas requeridas - Veo exactamente el mismo problema Código

KPAppDelegate.h

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> { 
    IBOutlet KPBrowseExpensesNavigationController *nc; 
} 

@property (strong) IBOutlet KPBrowseExpensesNavigationController *nc; 

KPAppDelegate.m

@implementation KPAppDelegate 

@synthesize nc; 

-(void)setNc:(KPBrowseExpensesNavigationController *)nc_ { 
    nc = nc_; // This gets called on view load and nc gets set. 
} 

...snip... 

// This is called about 5 seconds after app startup 
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { 
     // By the time we get here, nc is nil. 
     UITableViewController *tvc = [[nc viewControllers] objectAtIndex:0]; 
     [[tvc tableView] reloadData]; 
} 

@end 

ACTUALIZACIÓN

I debo estar haciendo algo realmente tonto aquí. Incluso un proyecto increíblemente simple todavía muestra este problema. Ver el enlace a continuación.

Download a simple test project that shows the problem.

+1

Muy MUY buen ejemplo de una pregunta –

Respuesta

2

En Window Nib, establezca la clase FilesOwner como UIApplication y luego apunte que es delegado de Outlets al objeto AppDelegate. Esto es lo que está mal en su ejemplo de proyecto.

+0

Usted, señor, es genial. Esto se me ocurrió, pero dado que el delegado parecía estar ejecutándose, pensé que este no sería el problema. ¡Ojalá hubiera intentado esto hace 5 horas ...! Gracias de nuevo. –

+0

no hay problema, es más fácil descubrirlo en un proyecto que en alguna línea de códigos aquí. hizo muy bien al explicar con un ejemplo de un proyecto :) –

1

No estoy seguro de por qué se declara como una propiedad & un no-propiedad.Debería hacer algo como esto:

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) IBOutlet KPBrowseExpensesNavigationController *nc; 

Y en su aplicación:

@implementation KPAppDelegate 

@synthesize nc = _nc; // So you don't accidentally use nc 

...snip... 

// This is called about 5 seconds after app startup 
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { 
     // By the time we get here, nc is nil. 
     UITableViewController *tvc = [[**self.nc** viewControllers] objectAtIndex:0]; 
     [[tvc tableView] reloadData]; 
} 

@end 

Espero que esto ayude!

+0

Gracias, pero sigue siendo nula. :(Yo claramente entendí mal @property, así que gracias por aclarar eso. –

2

¿su salida del Interface Builder está configurada como tipo KPBrowseExpensesNavigationController? Si no, no va a crear la conexión entre su plumilla y ViewController.

Se debe ajustar su clase personalizada como KPBrowseExpensesNavigationController en el inspector de identidad

+0

Sí. Hecho esto. Pero gracias por la sugerencia. –

+0

y aún no funciona? –

+0

Todavía no funciona. La salida/ivar sigue siendo nula. Ver mi actualización más arriba para un proyecto ultra sencillo que muestra el problema. –

1

no vi donde alloc su controlador de navegación. Solo declarar la propiedad no le asignará ningún valor, por lo que sería nulo. En usted -didFinishLaunchingWithOptions en el delegado de la aplicación, establezca su declaración alloc/init. Todo lo demás se ve bien.

KPBrowseExpensesNavigationController *nc = [[KPBrowseExpensesNavigationController alloc] init]; 

Si usted tiene un inicio personalizada, puede usar eso también, pero sólo asegúrese de que configurarlo antes de intentar usarlo.

+0

El controlador se inicializó en el archivo Nib. ¡Pero gracias por la sugerencia! –

Cuestiones relacionadas