2011-07-10 79 views
0

在.H使用我已經聲明:保留的NSString值以其他方法

// in database.h 
@interface database : UIViewController { 
    NSString* databaseName; 
    NSString* databasePath; 
} 

在執行時,是了methodA首先調用,這是我得到databasePath指向我database.db文件:

//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]; 

另一種方式來做到這一點是使用性質:

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

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

然後在您的@implementation

@synthesize databaseName, databasePath; 

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

//rest of your implementation... 
+0

太棒了。謝謝。並感謝其餘的您的輸入:) – TML

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

或更好的,瞭解屬性。

0

您可以通過兩種方式來實現:

首先,你可以保留自己的字符串:

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

可可Touch使用引用計數的內存管理,你可以讀到它here

其次,你可以使屬性。在您的.h文件中:

@property(nonatomic, copy) NSString *databasePath 

而且使用這樣的,當你設置:

[self setDatabasePath:stringByAppendingPathComponent:databaseName]; 

你可以閱讀有關性here

0

問題是您不保留(或複製)字符串引用。目前的範圍僅限於該方法。一旦該方法退出,由於stringByAppendingPathComponent:方法返回的字符串的自動釋放性質,對該字符串的引用將丟失。

這裏最簡單的方法可能是將databasePath聲明爲(nonatomic, copy) @property。這樣,當您將數據庫路徑的值分配給變量時,它會自動爲您複製。

@property(nonatomic, copy) NSString *databasePath; 

然後更新您的代碼以使用點語法。

self.databasePath = ...; 

不要忘記release databasePath在dealloc方法。

0

databasePathnil,因爲它正被分配給autorelease對象,即[documentsDir stringByAppendingPathComponent:databaseName]。這就是爲什麼databasePath在方法之外不可用。

至於其他的答案給了,您可以retain,或copy它在databasePath變量,以便它是可用,直到release它。

相關問題