2011-11-15 9 views
1

私はObjective-C初心者です。私はiPhoneプログラミングを勉強しています。私appDelegateappDelegateメンバーにアクセスしようとするとiPhoneアプリがクラッシュする

は、-(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; 
} 

は私がDatabasePathにをのNSLogと私は定期的に割り当てた後(それは文字列のパスであり、それがnullではない)、その値を取得します。

次に、私は-(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に直接割り当てますが、表示するメソッドは自動解放された文字列を返します。

あなたの特性は、retainまたはcopyと定義されていると思います。したがって値を

self.databasePath = [self copyDatabaseToDocuments]; 

と設定する必要があります。これにより、値が保持またはコピーされます。プロパティアクセサーを合成する場合は、を使用しないといいですか?を使用してください。

+0

本当にありがとうございます:私はまだメモリ管理(私はわずか1ヶ月のXCode/Objective-C/iPhoneの経験があります)はまだ快適ではないです... – AsTheWormTurns

+0

あなたはそこに行く:)良い情報がたくさんあるそこでは、それはトピックについてのSOの答えの多くで言及されている約4つの単純なルールにまで沸騰します。 – jrturton

+0

さらに、今学んでいる人にとって、自動参照カウントとストーリーボードに関連するものはあまり役に立ちません(実際には非常に混乱しています)。あなたは、あなたがもっと学ぶべきことを正確には知りません... – AsTheWormTurns

関連する問題