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,但您显示的方法返回一个自动释放的字符串。
我猜你的属性定义为retain
或copy
。因此,您应该将值设置为
self.databasePath = [self copyDatabaseToDocuments];
这将为您保留或复制该值。如果你不使用它们,合成属性访问器对你没有好处!
【讨论】:
非常感谢:事实上我对内存管理还不是很满意(我只有 1 个月的 XCode/Objective-C/iPhone 经验)... 你会到达那里 :) 那里有很多很好的信息,它确实归结为大约四个简单的规则,这些规则在关于该主题的许多 SO 答案中都提到了。 此外,对于现在正在学习的人来说,与自动引用计数和情节提要相关的任何事情都没有多大帮助(真的非常令人困惑)。你不知道你最好学什么...以上是关于iPhone 应用程序在尝试访问 appDelegate 成员时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在 xib 的 appdelegate 中检查设备是 ipad 还是 iphone?