2009-04-04 15 views
5

Tengo una propiedad que cambia a no válida cuando me muevo entre viewDidLoad y viewWillAppear. No tengo idea de por qué sucede eso.¿Por qué la propiedad NSString cambia a un valor no válido?

Tengo una clase auxiliar que obtiene la ruta a mi base de datos. Asigno esta clase en el delegado de la aplicación. RootViewController obtiene una referencia a la AppDelegate así:

//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 del ratón sobre AppDelegate para encontrar la clase de ayuda base de datos y la propiedad que contiene la ruta de base de datos:

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

de databasePath se declara una NSString. ¿Por qué ha cambiado a NSPathStore2?

Mientras continúo en el depurador sucede algo extraño. Una vez que aparece en viewWillAppear, el valor de la propiedad se vuelve "inválido" y el tipo vuelve a NSString. Aunque incluso he visto UIButton allí.

¿Por qué cambia a no válido? Ya no puedo usar la variable.

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

No hago nada entre viewDidLoad y viewWillAppear. Aquí es cómo se asigna de databasePath en la clase databaseHelper, que se da antes de applicationDidFinishLaunching:

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

stringByAppendingPathComponent devuelve un NSString. ¿Por qué obtengo un NSStorePath2 algún día después de la asignación?

Tengo todo funcionando sin problemas ahora solo llamando a [databaseHelper getDBpath]. Mi objetivo es guardar algunos ciclos de CPU y almacenar ese valor. De ahí que databasePath. ¿Alguna sugerencia de por qué el DatabasePath cambia a inválido?

+0

¿Por qué los votos a favor? ¡Esta es una pregunta mejor que una buena cantidad de preguntas pobres que reciben toneladas de votos favorables! –

Respuesta

5

Porque no ha conservado el valor. Revise las reglas en Memory Management Programming Guide para ver cuándo necesita retener algo.

Por supuesto, como notas cdespinosa, es probable que no necesite almacenar en caché este nombre de ruta en primer lugar. Probablemente no sea un gran asesino de rendimiento. Perfil primero, luego optimizar los puntos calientes.

+0

¿Cómo puede deducir que no estoy conservando cuando no se ha mostrado la implementación de databasePath? Aquí está la implementación: @property (nonatomic, retener) NSString * databasePath; – 4thSpace

+1

Porque eso es lo que causa ese síntoma. O bien su objeto murió (porque no lo retuvo) o lo reemplazó con otro (y no lo retuvo). O lo sobreescribió, pero eso es menos probable. En cuanto a @property: ¿Estás realmente usando la propiedad o asignándola directamente al ivar? –

+0

>> ... o asignando directamente al ivar? << Ese fue el problema. En databaseHelper, estaba asignando databasePath en lugar de self.databasePath. Este último conserva el valor. ¿Cual es la diferencia? ¡Y muchas gracias! – 4thSpace

3

Creo que se refiere a NSPathStore2, no a NSStorePath.

NSPathStore2 está en la subclase privada interna de NSString que se utiliza entre subsistemas donde se sabe que la cadena es una ruta del sistema de archivos. Es funcionalmente equivalente a un NSString en todas las formas que le interesarían.

No está claro, por su publicación, si tiene algún problema además de preguntarse qué clase es esa, y si hay alguna optimización que se pueda obtener almacenando en la memoria caché. La respuesta probablemente no sea: de todas las cosas que usan ciclos de CPU al acceder a una base de datos, el acceso a su ruta del sistema de archivos probablemente sea el último en la lista.

+0

No entendí tu último párrafo o por qué crees que tener tu valor convertido en inválido no es un problema. He editado la publicación para ser más claro. No estoy seguro de por qué hay un voto de -1. – 4thSpace

+0

No se convirtió en inválido. No se convirtió en nada. "NSPathStore2 es [una] subclase privada interna de NSString", es decir, ese objeto * es * un NSString.No es una instancia directa de NSString; es una instancia de una subclase, que es lo suficientemente buena. Solo trátalo como lo harías con cualquier otro NSString. –

+0

El problema es que estoy esperando un camino en databaePath. En su lugar, obtenga un valor de "no válido" cuando solía haber una ruta. Por alguna razón, el valor de la ruta desapareció. Sigues dando definiciones de NSString y NSPathStore2, que no es lo que estoy pidiendo. – 4thSpace

Cuestiones relacionadas