Почему свойство NSString изменяется на недопустимое значение? - PullRequest
5 голосов
/ 04 апреля 2009

У меня есть свойство, которое меняется на недопустимое при переходе между viewDidLoad и viewWillAppear. Я понятия не имею, почему это происходит.

У меня есть вспомогательный класс, который получает путь к моей базе данных. Я выделяю этот класс в делегате приложения. RootViewController получает ссылку на appDelegate следующим образом:

//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];
}

Я наведите курсор мыши на appDelegate, чтобы найти вспомогательный класс базы данных и свойство, содержащее путь к базе данных:

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

databasePath объявлен строкой NSString. Почему он изменился на NSPathStore2?

Когда я продолжаю в отладчике, происходит другая странная вещь. Как только я попадаю в viewWillAppear, значение свойства становится «недействительным», а тип возвращается к NSString. Хотя я даже видел там UIButton.

Почему он становится недействительным? Я больше не могу использовать переменную.

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

Я ничего не делаю между viewDidLoad и viewWillAppear. Вот как databasePath назначается в классе databaseHelper, что происходит ранее в applicationDidFinishLaunching:

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

stringByAppendingPathComponent возвращает строку NSString. Почему я получаю NSStorePath2 через некоторое время после назначения?

Теперь у меня все работает без проблем, но я просто вызываю [databaseHelper getDBpath]. Моя цель - сохранить несколько циклов процессора и сохранить это значение. Отсюда databasePath. Любые предложения, почему databasePath изменяется на недопустимый?

Ответы [ 2 ]

5 голосов
/ 05 апреля 2009

Потому что вы не сохранили значение. Просмотрите правила Руководство по программированию управления памятью , чтобы узнать, когда вам нужно что-то сохранить.

Конечно, как отмечает cdespinosa, вам, вероятно, не нужно сначала кэшировать этот путь. Это, вероятно, не большой убийца производительности. Сначала профиль, , затем , оптимизируйте горячие точки.

3 голосов
/ 04 апреля 2009

Полагаю, вы имеете в виду NSPathStore2, а не NSStorePath.

NSPathStore2 находится во внутреннем частном подклассе NSString, который используется среди подсистем, где известно, что строка является путем к файловой системе. Он функционально эквивалентен NSString во всех отношениях, которые вас интересуют.

Из вашего поста неясно, есть ли у вас какие-либо проблемы, кроме вопроса о том, что это за класс, и есть ли какая-либо оптимизация, которую можно получить путем его кэширования. Ответ, вероятно, нет: из всех вещей, которые используют циклы ЦП при доступе к базе данных, доступ к пути к ее файловой системе, вероятно, будет последним в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...