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

Objective c 通过静态方法访问实例变量,objective-c,Objective C,当我运行此命令时: @interface Database : NSObject { sqlite3 *database; } +(void)openDatabase; @end @implementation Database +(void)openDatabase { NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YE

当我运行此命令时:

@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];
}
我有一个错误:在类方法中访问实例变量数据库

我如何解决这个问题,我需要保持我的方法作为静态方法打开数据库,这样我就可以按类名使用它,例如:

[Database openDatabase];

不可能从类方法访问实例变量。但是,您可以声明一个全局变量:

static sqlite3 *database;
// ...
+ (void) openDatabase {
    sqlite3_open(filename, &database);
    // ...
}

您正试图从类方法访问数据库

将该声明更改为:

+ (void) openDatabase;

并通过传统的alloc+init实例化数据库对象,您就可以开始了

我也喜欢H2CO3和+1的答案,但我的答案,即大多数人对Objective C对象所做的,可能对你正在尝试做的事情更实用

作为参考,静态对于不同的人/语言意味着不同的东西。Objective-C主要是C加上一系列语法增强,Objective-C中的关键字static的含义与C中的相同,这与符号在链接方面的可见性有关。这与Java和C如何使用static这个词有着微妙但重要的区别


Objective-C没有用Java/C术语或类变量声明静态的语法。运行时对它们的支持见证了:class_getClassVariable的存在,但是没有语法来声明它们,所以它有点死胡同。如果我不得不猜测的话,我敢打赌这个特性存在于运行时中,以支持到其他使用静态/类变量的语言/运行时的桥接。正如其他人所建议的那样,解决这个问题的常用方法是使用全局变量或函数statics static(在C链接意义上)。

请使用标记来指示这是哪种语言Objective-C?可能重复感谢您的建议,我将在下一次指出编程语言:是的,这是Objective cOf当然,它更优雅,我们不喜欢全局变量。我决定写这篇文章,因为他需要保持方法的静态。很好的一点是,他想保持方法的静态。我们不知道他在干什么,但总的来说,我无法想象他为什么要静态地这么做。。。除非他可能混合了大量的C++和客观的C yykyyyk。谢谢Michael Dautermann,你和H2CO3是对的,但是我需要这个,因为我在很多地方使用了SQLite数据库,从数据库中插入、选择和删除,所以我期望这种方式是最好的方式。如果你有任何建议,以加强我的代码,我将感谢你。。。提前感谢+1解决了问题中的一些误解。然而,静态在OO语言中通常意味着类方法。可以区分类方法和用static关键字声明的变量/函数。似乎这个问题的作者实际上理解了它。@H2CO3提问者显然在Java/C/class变量意义上使用了static关键字。您的答案在C上下文中使用关键字static,并且在您的答案中使用C static关键字与它是一个全局变量这一事实是正交的-它仍然是一个没有静态的全局变量。这就是为什么我要费心提及它。我知道它将是一个全局变量,然而,它只是为了使它成为内部变量。听起来好像每个人都在同一页上你好,H2CO3,非常感谢,它正在工作。。我知道我不能从类方法访问任何实例变量,但我想要的是如何做到这一点,你的回答帮助了我。。。再次感谢:
- (void) openDatabase;