2011-11-15 56 views
1

我是一名Objective-C新手,正在学习iPhone编程。尝试访问appDelegate会员时,iPhone应用程序崩溃

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

我将其值设置是这样的:

databasePath = [self copyDatabaseToDocuments]; 

我从一个极好的书阿拉斯代尔·阿伦复制整个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方法中设置的),那么应用程序会崩溃。

为什么?

+1

您可以在databasePath的头文件中编写@property的定义吗? –

回答

2

确保您的databasePath @property看起来是这样的:

@property (nonatomic, retain) NSString *databasePath; 

然后将其设置这种方式:

self.databasePath = [self copyDatabaseToDocuments]; 

这可能是因为崩溃返回copyDatabaseToDocuments的自动释放的字符串,除非你使用自我。注释来设置databasePath,那个自动释放的字符串可以在任何时候消失。

+1

我疯了,谢谢! – AsTheWormTurns

1

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

我猜你的财产被定义为retaincopy。因此,您应该将该值设置为

self.databasePath = [self copyDatabaseToDocuments]; 

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

+0

非常感谢:事实上,我对内存管理还不是很满意(我只有1个月的XCode/Objective-C/iPhone体验)... – AsTheWormTurns

+0

你会到达那里:)有很多很好的信息在那里,它归结为四个简单的规则,这些规则在很多关于该主题的SO答案中都有提到。 – jrturton

+0

此外,对于一个现在正在学习的人来说,它对自动引用计数和故事板相关的任何事情都没有什么帮助(它真的很令人困惑)。你不完全知道你最好学习什么...... – AsTheWormTurns

相关问题