我是一名Objective-C新手,我正在研究iPhone编程。
在我的 appDelegate 中,在-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中,我有一个名为 databasePath 的类成员(@syntethized)。
我这样设定了它的价值:
databasePath = [self copyDatabaseToDocuments];
我从Alasdair Allan的一本精彩的书中复制了整个 copyDatabaseToDocuments 方法并进行了很少的更改(db的名称是我唯一改变的地方):
-(NSString *)copyDatabaseToDocuments{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath=[paths objectAtIndex:0];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"myDb.sqlite"];
//
if(![fileManager fileExistsAtPath:filePath]){
NSString *bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"myDb.sqlite"];
[fileManager copyItemAtPath:bundlePath toPath:filePath error:nil];
}
return filePath;
}
我NSLog databasePath ,我在分配后经常得到它的值(它是一个字符串路径,它不是null)。
然后,我有一个方法-(NSMutableArray*)readDatabase:(char*)querySQL
我通过委托引用从ViewController调用。
如果 - 在最后一个方法中 - 任何工作正常 - 我再次分配databasePath的值。
但是,如果我不再分配它并且我想使用它的值(我认为它是在-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中设置的)应用程序崩溃了。
为什么?
答案 0 :(得分:2)
确保您的@property for databasePath如下所示:
@property (nonatomic, retain) NSString *databasePath;
然后以这种方式设置它:
self.databasePath = [self copyDatabaseToDocuments];
它可能会崩溃,因为copyDatabaseToDocuments返回一个自动释放的字符串,除非你使用self。设置databasePath的表示法,自动释放的字符串可以随时消失。
答案 1 :(得分:1)
猜测一下,由于您没有显示相关代码,因此您不会保留databasePath
的值。您可以在上面的代码示例中将其直接分配给ivar,但您显示的方法将返回一个自动释放的字符串。
我猜您的属性定义为retain
或copy
。因此,您应将值设置为
self.databasePath = [self copyDatabaseToDocuments];
然后,这将保留或复制您的值。如果你没有使用它们,那么合成属性访问器对你没有好处!