尝试访问appDelegate成员时,iPhone应用程序崩溃

时间:2011-11-15 15:00:04

标签: iphone objective-c

我是一名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方法中设置的)应用程序崩溃了。

为什么?

2 个答案:

答案 0 :(得分:2)

确保您的@property for databasePath如下所示:

@property (nonatomic, retain) NSString *databasePath;

然后以这种方式设置它:

self.databasePath = [self copyDatabaseToDocuments];

它可能会崩溃,因为copyDatabaseToDocuments返回一个自动释放的字符串,除非你使用self。设置databasePath的表示法,自动释放的字符串可以随时消失。

答案 1 :(得分:1)

猜测一下,由于您没有显示相关代码,因此您不会保留databasePath的值。您可以在上面的代码示例中将其直接分配给ivar,但您显示的方法将返回一个自动释放的字符串。

我猜您的属性定义为retaincopy。因此,您应将值设置为

self.databasePath = [self copyDatabaseToDocuments];

然后,这将保留或复制您的值。如果你没有使用它们,那么合成属性访问器对你没有好处!