当我运行时:
@interface Database : NSObject {
sqlite3 *database;
}
+(void)openDatabase;
@end
@implementation Database
+(void)openDatabase
{
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *databaseNameandPath = [NSString stringWithFormat:@"%@/DatabaseSnax.sqlite",docDir];
NSString *databasePath=[[NSString alloc]initWithFormat:databaseNameandPath];
if(sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK)
{
NSLog(@"Error when open the database");
}
[databasePath release];
}
我有这个错误:instance variable database accessed in class method
我如何解决这个问题,我需要将我的方法(开放数据库)保存为静态方法,以便我可以按类名使用它,例如:
[Database openDatabase];
答案 0 :(得分:3)
不可能从类方法中访问实例变量。但是,您可以声明一个全局变量:
static sqlite3 *database;
// ...
+ (void) openDatabase {
sqlite3_open(filename, &database);
// ...
}
答案 1 :(得分:3)
您尝试从类方法(which are different from instance methods)访问database
。
从以下地址更改声明:
+ (void) openDatabase;
到
- (void) openDatabase;
通过传统的Database
+ alloc
对您的init
对象进行实例化,您就可以了。
我也喜欢H2CO3的答案(并给他+1),但我的回答(这是大多数人与Objective C对象有关的)对于你想要做的事情可能更实用。
答案 2 :(得分:2)
作为参考,static
对不同的人/语言意味着不同的东西。 Objective-C主要是C加上一堆语法增强,Objective-C中的关键字static
具有与C中相同的含义,它涉及符号相对于链接的可见性。这与Java和C#使用static这个词的方式有些微妙但重要的不同。
Objective-C没有声明“静态”(在Java / C#用语中)或“类”变量的语法。运行时对它们有“支持”(见证了class_getClassVariable
的存在)但是没有语法来声明它们,所以它有点死路一条。 (如果我不得不猜测,我敢打赌,运行时中存在此功能,以支持使用静态/类变量的其他语言/运行时的桥接。)正如其他人所建议的那样,常见的方法是使用全局变量(或函数静态(C {联动意义上的static
。))