【问题标题】:iPhone app crashes when attempting to access appDelegate memberiPhone 应用程序在尝试访问 appDelegate 成员时崩溃
【发布时间】:2011-11-15 15:00:04
【问题描述】:

我是一名 Objective-C 新手,正在学习 iPhone 编程。

在我的 appDelegate 中,在 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中,我有一个名为 databasePath 的类成员 (@syntethized)。

我这样设置它的值:

databasePath = [self copyDatabaseToDocuments];

我从 Alasdair Allan 的一本好书中复制了整个 copyDatabaseToDocuments 方法,并且只做了很少的更改(数据库的名称是我唯一更改的):

-(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 并在分配后定期获取它的值(它是一个字符串路径,它不为空)。

然后,我有一个方法 -(NSMutableArray*)readDatabase:(char*)querySQL 我通过委托引用从 ViewController 调用。

如果 - 在最后一个方法内 - 我再次分配 databasePath 的值,任何事情都可以正常工作。

但是,如果我不再次分配它并且我想使用它的值(我想它是在 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中设置的),应用程序就会崩溃。

为什么?

【问题讨论】:

  • 能把@property的定义写在databasePath的头文件里吗?

标签: iphone objective-c


【解决方案1】:

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

@property (nonatomic, retain) NSString *databasePath;

然后这样设置:

self.databasePath = [self copyDatabaseToDocuments];

它可能会崩溃,因为 copyDatabaseToDocuments 返回一个自动释放的字符串,除非你使用 self.设置数据库路径的符号,自动释放的字符串可以随时消失。

【讨论】:

    【解决方案2】:

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

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

    self.databasePath = [self copyDatabaseToDocuments];
    

    这将为您保留或复制该值。如果你不使用它们,合成属性访问器对你没有好处!

    【讨论】:

    • 非常感谢:事实上我对内存管理还不是很满意(我只有 1 个月的 XCode/Objective-C/iPhone 经验)...
    • 你会到达那里 :) 那里有很多很好的信息,它确实归结为大约四个简单的规则,这些规则在关于该主题的许多 SO 答案中都提到了。
    • 此外,对于现在正在学习的人来说,与自动引用计数和情节提要相关的任何事情都没有多大帮助(真的非常令人困惑)。你不知道你最好学什么...
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2017-01-27
    相关资源
    最近更新 更多