2011-07-10 6 views
0

に使用されます。は私が宣言したの.hで他の方法

//methodA: in database.m 
- (void)methodA { 
    databaseName = @"database.db"; 
    NSArray* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString* documentsDir = [documentsPath objectAtIndex:0]; 
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 

    NSFileManager* filemagar = [NSFileManager defaultManager]; 
    NSString* databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 
    [filemagar copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 

    NSLog (@"databasePath is...%@", databasePath); 

[filemagar release]; 
} 

databasePathは、フォルダパス名 "/ Users/...."の文字列を返します。これが私の必要なものです。さて、その後

、私は方法Bを呼び出す...:

//methodB: in database.m 
- (void)methodB { 
    NSLog (@"databasePath is now...%@", databasePath); 
} 

プログラムは、以前のメソッド文字列を指していることをDatabasePathに通り終了し、もはや同じです。

後で他の方法で使用できるように、databasePath情報を保持するにはどうすればよいですか?

答えて

2

このライン:

databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 

は次のようになります。これを行うには

databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] copy]; 

もう一つの方法は、プロパティを使用することです:あなた@implementationで次に

@interface database : UIViewController { 
    NSString* databaseName; 
    NSString* databasePath; 
} 

@property (nonatomic, copy) NSString *databaseName; 
@property (nonatomic, copy) NSString* databasePath; 

@synthesize databaseName, databasePath; 

- (void) dealloc { 
    [self setDatabaseName:nil]; 
    [self setDatabasePath:nil]; 
    [super dealloc]; 
} 

//rest of your implementation... 
+0

fantastic。ありがとうございました。あなたの入力のための残りのおかげで:) – TML

0
databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain]; 

またはそれ以上のプロパティについて知る。

0

次の2つの方法でこれを行うことができます:

まず、あなたが自分で文字列を保持することができます

databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain]; 

ココアタッチは、メモリ管理のための参照カウントを使用して、あなたはそれhereについて読むことができます。

第2に、プロパティを作成できます。

@property(nonatomic, copy) NSString *databasePath 

そして、あなたがそれを設定すると、このようにそれを使用する:あなたの.hファイルで

[self setDatabasePath:stringByAppendingPathComponent:databaseName]; 

あなたは、プロパティhereについて読むことができます。

0

問題は、文字列リファレンスを保持していないことです。現在のスコープは、メソッドのスコープに制限されています。メソッドが終了すると、stringByAppendingPathComponent:メソッドによって返された文字列の自動解放の性質のおかげで、文字列への参照が失われます。

ここで最も簡単なアプローチは、databasePath(nonatomic, copy) @propertyと宣言することです。このように、データベースパスの値を変数に代入すると、自動的にコピーされます。

@property(nonatomic, copy) NSString *databasePath; 

次に、ドットシンタックスを使用するようにコードを更新します。

self.databasePath = ...; 

はあなたのdealloc方法でrelease DatabasePathにすることを忘れないでください。

0

databasePathautoreleaseオブジェクト([documentsDir stringByAppendingPathComponent:databaseName])に割り当てられているため、nilです。そのため、方法の外側ではdatabasePathは利用できません。他の回答を与えてきたように

、あなたのいずれかを行うことができdatabasePath変数でretainそれをかcopyそれそれはあなたreleaseそれまで利用可能であるように。

関連する問題