2009-04-04 8 views
5

Mam właściwość, która zmienia się na nieprawidłową, ponieważ poruszam się między viewDidLoad i viewWillAppear. Nie mam pojęcia, dlaczego tak się dzieje.Dlaczego właściwość NSString zmienia się na nieprawidłową wartość?

Mam klasę pomocniczą, która pobiera ścieżkę do mojej bazy danych. Przydzielam tę klasę do delegata aplikacji. RootViewController pobiera odwołanie do appDelegate tak:

//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 myszy nad appDelegate znaleźć klasę pomocniczą bazę danych i własności zawierający ścieżkę do bazy danych:

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

DatabasePath deklarowaną NSString. Dlaczego zmieniło się na NSPathStore2?

Kontynuując debugger, dzieje się coś dziwnego. Gdy pojawi się viewWillAppear, wartość właściwości staje się "nieważna", a typ powraca do NSString. Pomyślałem, że widziałem tam nawet Uibutton.

Dlaczego jest nieważny? Nie mogę już używać zmiennej.

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

Nie robię nic między viewDidLoad i viewWillAppear. Oto jak DatabasePath jest przypisany do klasy databaseHelper, który występuje wcześniej applicationDidFinishLaunching:

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

stringByAppendingPathComponent zwraca NSString. Dlaczego po zleceniu dostaję NSStorePath2 po drodze?

Mam wszystko działa bez problemu, ale po prostu wywołanie [databaseHelper getDBpath]. Moim celem jest zaoszczędzenie kilku cykli procesora i zachowanie tej wartości. Stąd databasePath. Wszelkie sugestie, dlaczego zmiany właściwości databasePath są nieprawidłowe?

+0

Dlaczego spadki? To jest lepiej zadane pytanie niż dobra liczba ubogich pytań, które otrzymują mnóstwo przebojów! –

Odpowiedz

5

Ponieważ nie zachowano wartości. Przejrzyj zasady w Memory Management Programming Guide, aby zobaczyć, kiedy musisz coś zatrzymać.

Oczywiście, jak zauważa cdespinosa, prawdopodobnie nie musisz najpierw buforować tej ścieżki. To prawdopodobnie nie jest wielki zabójca wydajności. Najpierw profil, , następnie zoptymalizuj gorące miejsca.

+0

W jaki sposób można wywnioskować, że nie zachowuję się, gdy implementacja dla bazy danych nie została wyświetlona? Oto implementacja: @property (nonatomic, retain) NSString * databasePath; – 4thSpace

+1

Bo to właśnie powoduje ten objaw. Albo twój obiekt umarł (ponieważ go nie zatrzymałeś) lub zastąpiłeś go innym (i nie zachował go). Albo przesadziłeś, ale to mniej prawdopodobne. Jeśli chodzi o właściwość @: czy faktycznie korzystasz z właściwości lub przypisujesz ją bezpośrednio do ivar? –

+0

>> ... lub przypisanie bezpośrednio do ivar? << To był problem. W databaseHelper przypisałem metodę databasePath zamiast self.databasePath. Ten ostatni zachowuje wartość. Co za różnica? I wielkie dzięki! – 4thSpace

3

Wierzę, że masz na myśli NSPathStore2, a nie NSStorePath.

NSPathStore2 znajduje się w wewnętrznej podklasie prywatnej NSString, która jest używana w podsystemach, w których ciąg jest ścieżką systemu plików. Jest funkcjonalnie równoważny NSStringowi we wszystkich aspektach, na których ci zależy.

Z twojego postu nie wynika jasno, czy masz jakiekolwiek problemy poza zastanawianiem się, czym jest ta klasa, i czy istnieje możliwość optymalizacji poprzez buforowanie. Odpowiedź prawdopodobnie nie jest: ze wszystkich rzeczy, które korzystają z cykli CPU podczas uzyskiwania dostępu do bazy danych, dostęp do jej ścieżki do systemu plików prawdopodobnie będzie ostatni na liście.

+0

Nie rozumiałem twojego ostatniego akapitu lub dlaczego uważasz, że zmiana wartości na nieważną nie jest problemem. Edytowałem post, mam nadzieję, że będzie bardziej przejrzysty. Nie wiem, dlaczego istnieje głosowanie -1. – 4thSpace

+0

To nie zmieniło się w nieprawidłowe. To nie zmieniło się w nic. "NSPathStore2 jest [wewnętrzną] prywatną podklasą NSString" -i.e., Tym obiektem * jest * NSString.To nie jest bezpośredni przykład NSString; to instancja podklasy, która jest wystarczająco dobra. Po prostu traktuj tak, jak każdy inny NSString. –

+0

Problem polega na tym, że oczekuję ścieżki w bazie danych databae. Zamiast tego uzyskaj wartość "invalid", gdy używasz ścieżki. Z jakiegoś powodu wartość ścieżki zniknęła. Nadal podajecie definicje NSString i NSPathStore2, co nie jest tym, o co proszę. – 4thSpace

Powiązane problemy