2011-11-15 54 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

相關問題