通过静态方法访问实例变量

时间:2012-01-15 17:08:52

标签: objective-c

当我运行时:

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

3 个答案:

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