保留要在其他方法中使用的NSString值

时间:2011-07-10 05:33:54

标签: iphone objective-c cocoa-touch

在.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信息,以便以后可以在其他方法中使用?

5 个答案:

答案 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)

databasePathnil,因为它已分配给autorelease对象,即[documentsDir stringByAppendingPathComponent:databaseName]。这就是为什么databasePath在方法之外不可用的原因。

正如其他答案一样,您可以在retain变量中copydatabasePath,以便在 {{1它。