2012-01-15 115 views
3

当我运行此:访问实例变量

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

请使用标签来表明这是哪种语言(Objective-C?) – 2012-01-15 17:12:18

+0

[类方法错误中访问的实例变量'变量' ://stackoverflow.com/questions/8016904/instance-variable-variable-accessed-in-class-method-error) – Caleb 2012-01-15 17:49:40

+0

感谢您的建议,我会在接下来的时间里指出编程语言:)是的,它的Objective-c – 2012-01-23 11:07:27

回答

3

不能从类方法访问实例变量。然而,你可以声明一个全局变量,:

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

嗨H2CO3,谢谢你,现在工作..我知道我不能从类方法访问任何实例变量,但我想要的是如何做是,你的回答帮助了我......再次感谢:) – 2012-01-16 08:27:13

3

您正在尝试从一个类的方法(which are different from instance methods)访问database

更改该声明来自:

+ (void) openDatabase; 

- (void) openDatabase; 

,并通过传统alloc + init实例化对象Database,你会用自己的方式。

我也喜欢H2CO3的答案(和他+1),但我的答案(这是大多数人与Objective C对象所做的事情)可能对你正在尝试做的事更实际。

+0

当然,它更优雅,我们不喜欢全局变量。我只是决定写这个,因为他写了他需要保持静态方法。 – 2012-01-15 17:23:07

+0

好点(他希望保持静态方法)。我们不知道他在干什么,但总的来说,我无法想象他为什么要静静地做这件事......除非他可能混合了很多C++和Objective C(恶心的恶作剧)。 – 2012-01-15 17:24:37

+1

你是对的Caleb ...我会改变我的答案pronto。 – 2012-01-15 17:32:46

2

作为参考,static对不同的人/语言意味着不同的事情。 Objective-C主要是C语言和一些语法增强功能,Objective-C中的关键字static的含义与它在C语言中的含义相同,它与符号在链接方面的可见性有关。这与Java和C#如何使用单词static是微妙而重要的不同。 Objective-C没有声明“static”(用Java/C#说法)或“class”变量的语法。运行时对它们有“支持”(见证存在:class_getClassVariable),但没有语句来声明它们,所以它有点死胡同。 (如果我不得不猜测,我敢打赌,这个特性存在于运行时中,以支持使用静态/类变量的其他语言/运行时的桥梁。)正如其他人所建议的,常见的解决方法是使用全局变量(或函数静态(在C链接意义上为static))

+1

+1解决了一些在问题中体现的误解。 – Caleb 2012-01-15 17:41:58

+0

但是,“静态”一般意味着OO语言中的类方法。我们可以区分使用“static”关键字声明的类方法和变量/函数。看来这个问题的作者实际上理解它。 – 2012-01-15 17:46:34

+0

@ H2CO3提问者在Java/C#/“类变量”意义上明确使用关键字'static'。你的回答在C语境中使用关键字'static'(并且在你的回答中使用C'static'关键字与它是一个全局变量的事实是正交的 - 它仍然是一个没有'static'的全局变量)。这就是为什么我不屑一提的原因。 – ipmcc 2012-01-15 21:33:29