在.h我宣布:
// 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信息,以便以后可以在其他方法中使用?
答案 0 :(得分: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...
答案 1 :(得分:0)
databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain];
或者更好,了解属性。
答案 2 :(得分:0)
您可以通过两种方式执行此操作:
首先,你可以保留自己的字符串:
databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain];
Cocoa Touch使用引用计数进行内存管理,您可以阅读here。
其次,您可以制作属性。在你的.h文件中:
@property(nonatomic, copy) NSString *databasePath
设置时使用它:
[self setDatabasePath:stringByAppendingPathComponent:databaseName];
您可以阅读有关属性here的信息。
答案 3 :(得分:0)
问题是您没有保留(或复制)字符串引用。其当前范围仅限于该方法的范围。一旦该方法退出,由于stringByAppendingPathComponent:
方法返回的字符串的自动释放性质,对字符串的引用将丢失。
这里最简单的方法可能是将databasePath
声明为(nonatomic, copy) @property
。这样,当您将数据库路径的值分配给变量时,会自动为您复制它。
@property(nonatomic, copy) NSString *databasePath;
然后更新您的代码以使用点语法。
self.databasePath = ...;
不要忘记release
方法中的dealloc
databasePath。
答案 4 :(得分:0)
databasePath
为nil
,因为它已分配给autorelease
对象,即[documentsDir stringByAppendingPathComponent:databaseName]
。这就是为什么databasePath
在方法之外不可用的原因。
正如其他答案一样,您可以在retain
变量中copy
或databasePath
,以便在你 {{1它。