2012-01-15 117 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