2012-06-19 8 views
6

Il problemaPerché il mio IBOutlet viene rilasciato sotto ARC?

Un IBOutlet viene rilasciato prima ho la possibilità di usarla.

What I Want

Voglio accedere a un controller di navigazione dalla mia app delegato in modo da poter ricaricare una vista tabella.

mio Setup

ho:

  • Un Main.xib che è impostato come il mio principale interfaccia nelle impostazioni di destinazione
  • Un IBOutlet al controller di navigazione come un Ivar sulla mia app delegato
  • Questo IBOutlet è stato collegato al controller di navigazione corretto in Main.xib
  • Il delegato dell'app è istanziato in th e XI ter ma non impostati come proprietario del file

sto usando ARC, Xcode 4.3.2 e iOS5.1

quello che ho provato

  • Modifica destinazione di distribuzione
  • Mettere un punto di interruzione su dealloc per il controller di navigazione, delegato app - non vengono mai chiamati
  • Leggere tutto ciò che riesco a trovare su ARC e IBOutlets - niente sembra cont radict quello che sto facendo
  • Creazione di un nuovo progetto con solo le classi minimi richiesti - vedo esattamente lo stesso problema

Codice

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 

UPDATE

ho devo fare qualcosa di veramente stupido qui. Anche un progetto incredibilmente semplice mostra ancora questo problema. Vedi il link qui sotto.

Download a simple test project that shows the problem.

+1

Molto MOLTO buon esempio di una domanda –

risposta

2

Nel pennino Finestra, impostare la classe FilesOwner come applicazione UIA e quindi indirizzare il delegato dalle prese all'oggetto AppDelegate. Questo è ciò che è sbagliato nell'esempio del tuo progetto.

+0

Tu, signore, sei brillante. Mi è successo, ma visto che il delegato sembrava essere stato giustiziato, io Ho pensato che questo non sarebbe stato il problema. Vorrei aver provato questo 5 ore fa ...! Grazie ancora. –

+0

nessun problema, è più facile capirlo su un progetto piuttosto che su qualche linea di codici qui. fatto molto bene spiegando con un esempio di un progetto :) –

1

io non sono sicuro perché si dichiara come una proprietà & un non-proprietà.Devo fare qualcosa di simile:

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> 

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

E nell'implementazione:

@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 

Spero che questo aiuti!

+0

Grazie, ma è ancora nullo. :(Ho chiaramente frainteso @property quindi grazie per averlo chiarito. –

2

è la presa dal set di Interface Builder come tipo KPBrowseExpensesNavigationController? In caso contrario, non creerà la connessione tra pennino e ViewController.

È necessario impostare la sua classe personalizzata come KPBrowseExpensesNavigationController in Identity Inspector

+0

Sì. Fatto. Ma grazie per il suggerimento –

+0

e ancora non funziona? –

+0

Ancora non funziona Lo sbocco/ivar è ancora nullo Vedi il mio aggiornamento sopra per un progetto semplicissimo che mostra il problema –

1

non ho visto dove si alloc il controller di navigazione. Solo dichiarare la proprietà non gli assegnerà alcun valore, quindi sarebbe nullo. In te -didFinishLaunchingWithOptions nel delegato dell'app, imposta la tua istruzione alloc/init. Tutto il resto sembra a posto.

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

Se si dispone di un init personalizzato, è possibile utilizzare anche questo, ma solo assicurarsi di configurarlo prima di provare e usarlo.

+0

Il controller è stato inizializzato nel file del pennino, ma grazie per il suggerimento! –

Problemi correlati