Сохранение значения NSString для использования в других методах - PullRequest
0 голосов
/ 10 июля 2011

В .h я объявил:

// in database.h
@interface database : UIViewController {
    NSString* databaseName;
    NSString* databasePath;
}

При выполнении сначала вызывается метод A, и я получаю, что databasePath указывает на мой файл database.db:

//methodA: in database.m
- (void)methodA {
    databaseName = @"database.db";  
    NSArray* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentsDir = [documentsPath objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    NSFileManager* filemagar = [NSFileManager defaultManager];
    NSString* databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
    [filemagar copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    NSLog (@"databasePath is...%@", databasePath);

[filemagar release];
}

DatabasePath вернет строку с именем пути к папке "/ Users / ....".Так что это то, что мне нужно.

Теперь, когда я вызываю метод B ...:

//methodB: in database.m
- (void)methodB {
    NSLog (@"databasePath is now...%@", databasePath);
}

Программа завершается как databasePath, который указывает на предыдущие строки метода, больше нетот же самый.

Как сохранить информацию для databasePath, чтобы позже я смог использовать ее в других методах?

Ответы [ 5 ]

2 голосов
/ 10 июля 2011

Эта строка:

databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

Должно быть:

databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] copy];

Другой способ сделать это - использовать свойства:

@interface database : UIViewController {
    NSString* databaseName;
    NSString* databasePath;
}

@property (nonatomic, copy) NSString *databaseName;
@property (nonatomic, copy) NSString* databasePath;

Тогда в@implementation:

@synthesize databaseName, databasePath;

- (void) dealloc {
   [self setDatabaseName:nil];
   [self setDatabasePath:nil];
   [super dealloc];
}

//rest of your implementation...
0 голосов
/ 10 июля 2011

databasePath равно nil, поскольку оно присваивается объекту autorelease, то есть [documentsDir stringByAppendingPathComponent:databaseName]. Вот почему databasePath недоступен вне метода.

Как и другие ответы, вы можете либо retain it, либо copy it в переменной databasePath, чтобы она была доступна до you release it.

0 голосов
/ 10 июля 2011

Проблема в том, что вы не сохраняете (или не копируете) ссылку на строку.Его текущая область действия ограничена областью применения метода.После выхода из метода ссылка на строку теряется благодаря авторелизной природе строки, возвращаемой методом stringByAppendingPathComponent:.

Самым простым подходом здесь, вероятно, было бы объявление databasePath как (nonatomic, copy) @property.Таким образом, когда вы присваиваете значение пути базы данных переменной, оно автоматически копируется для вас.

@property(nonatomic, copy) NSString *databasePath;

Затем обновите свой код, чтобы использовать точечный синтаксис.

self.databasePath = ...;

Не забудьте release databasePath в вашем dealloc методе.

0 голосов
/ 10 июля 2011

Вы можете сделать это двумя способами:

Во-первых, вы можете оставить себе строку:

databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain];

Cocoa Touch использует счетчик ссылок для управления памятью, вы можете прочитать об этом здесь .

Во-вторых, вы можете сделать свойства. В вашем .h файле:

@property(nonatomic, copy) NSString *databasePath

И используйте его следующим образом:

[self setDatabasePath:stringByAppendingPathComponent:databaseName];

Вы можете прочитать о свойствах здесь .

0 голосов
/ 10 июля 2011
databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain];

А лучше узнать о свойствах.

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