2009-04-04 14 views
5

Ho una proprietà che diventa non valida mentre mi muovo tra viewDidLoad e viewWillAppear. Non ho idea del perché ciò avvenga.Perché la proprietà NSString cambia in valore non valido?

Ho una classe di supporto che ottiene il percorso del mio database. Assegno questa classe al delegato dell'app. RootViewController ottiene un riferimento al AppDelegate in questo modo:

//inside .h file 
@interface RootViewController : UITableViewController 
<UITableViewDelegate, UITableViewDataSource>{ 
NSArray *controllers; 
myAppDelegate *appDelegate; 
} 

//inside .m file 
@implementation RootViewController 
@synthesize controllers; 

- (void)viewDidLoad { 
appDelegate = [[UIApplication sharedApplication] delegate]; 

self.controllers = appDelegate.topicControllers; 
[super viewDidLoad]; 
} 

I mouse sopra AppDelegate per trovare la classe di database di supporto e la proprietà che contiene il percorso del database:

NSPathStore2 * appDelegate.databaseHeper.databasePath "/Users/userA/Library/Application Support/iPhone Simulator/User/Applications..." 

databasePath viene dichiarato un NSString. Perché è cambiato in NSPathStore2?

Mentre continuo nel debugger, succede un'altra cosa strana. Una volta ottenuto in viewWillAppear, il valore della proprietà diventa "non valido" e il tipo torna a NSString. Anche se ho visto UIButton lì dentro.

Perché non è valido? Non posso più usare la variabile.

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; //changes before this line executes 
} 

non faccio nulla tra viewDidLoad e viewWillAppear. Ecco come databasePath viene assegnato nella classe databaseHelper, che si verifica in precedenza su applicationDidFinishLaunching:

- (NSString *) getDBPath { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
return [documentsDir stringByAppendingPathComponent:self.databaseName]; 
} 

stringByAppendingPathComponent restituisce un NSString. Perché ottengo un NSStorePath2 a volte lungo la strada dopo l'assegnazione?

Ora ho tutto senza problemi, ma ho appena chiamato [databaseHelper getDBpath]. Il mio obiettivo è quello di salvare alcuni cicli della CPU e memorizzare quel valore. Quindi databasePath. Qualche suggerimento perché databasePath cambia in non valido?

+0

Perché i downvotes? Questa è una domanda migliore di un buon numero di domande povere che ricevono tonnellate di upvotes! –

risposta

5

Perché non è stato mantenuto il valore. Rivedere le regole in Memory Management Programming Guide per vedere quando è necessario conservare qualcosa.

Naturalmente, come note di cdespinosa, probabilmente non è necessario memorizzare questo nome di percorso in primo luogo. Probabilmente non è un grande killer delle prestazioni. Prima il profilo, quindi ottimizza i punti caldi.

+0

Come è possibile dedurre che non sto mantenendo quando l'implementazione per databasePath non è stata visualizzata? Ecco l'implementazione: @property (nonatomic, retain) NSString * databasePath; – 4thSpace

+1

Perché è questo che causa quel sintomo. O il tuo oggetto è morto (perché non lo hai conservato) o lo hai sostituito con un altro (e non lo hai mantenuto). Oppure hai esagerato, ma è meno probabile. Per quanto riguarda @property: stai effettivamente utilizzando la proprietà o assegnando direttamente a ivar? –

+0

>> ... o assegnando direttamente all'avorare? << Questo era il problema. In databaseHelper, stavo assegnando databasePath invece di self.databasePath. Quest'ultimo mantiene il valore. Qual è la differenza? E grazie mille! – 4thSpace

3

Credo si intenda NSPathStore2, non NSStorePath.

NSPathStore2 è nella sottoclasse privata interna di NSString utilizzata tra i sottosistemi in cui la stringa è nota come percorso del file system. È funzionalmente equivalente a una NSString in tutti i modi che ti interessano.

Non è chiaro dal tuo post se hai qualche problema se non chiedersi cosa sia quella classe, e se ci sia qualche ottimizzazione da ottenere memorizzandola nella cache. La risposta probabilmente non è: tra tutte le cose che usano i cicli della CPU quando si accede a un database, l'accesso al suo percorso del file system probabilmente sarà l'ultimo della lista.

+0

Non ho capito il tuo ultimo paragrafo o il motivo per cui ritieni che trasformare il tuo valore in invalido non sia un problema. Ho modificato il post, si spera che sia più chiaro. Non so perché c'è un voto di -1. – 4thSpace

+0

Non è diventato invalido. Non si è trasformato in nulla. "NSPathStore2 è [an] sottoclasse privata interna di NSString" -i.e., Quell'oggetto * è * un NSString.Non è un'istanza diretta di NSString; è un'istanza di una sottoclasse, che è abbastanza buona. Trattalo come faresti con qualsiasi altro NSString. –

+0

Il problema è che sto aspettando un percorso in databaePath. Ma invece ottenere un valore di "non valido" quando ci vuole essere un percorso. Per qualsiasi motivo, il valore del percorso è scomparso. Continui a dare definizioni di NSString e NSPathStore2, che non è quello che sto chiedendo. – 4thSpace

Problemi correlati