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

Posted

技术标签:

【中文标题】iPhone 应用程序在尝试访问 appDelegate 成员时崩溃【英文标题】:iPhone app crashes when attempting to access appDelegate member 【发布时间】: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的头文件里吗? 【参考方案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 答案中都提到了。 此外,对于现在正在学习的人来说,与自动引用计数和情节提要相关的任何事情都没有多大帮助(真的非常令人困惑)。你不知道你最好学什么...

以上是关于iPhone 应用程序在尝试访问 appDelegate 成员时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

脸书整合 iphone

在自身外部访问和修改 AppDelegate

如何在 xib 的 appdelegate 中检查设备是 ipad 还是 iphone?

从 AppDelegate 访问当前视图

Appdelegate 适用于 iPhone,但不适用于 iPad 版本

在 tableview 控制器中访问 AppDelegate 函数?