Доступ к переменной экземпляра через статический метод - PullRequest
3 голосов
/ 15 января 2012

Когда я запускаю это:

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

3 голосов
/ 15 января 2012

Вы пытаетесь получить доступ к database из метода класса (, который отличается от методов экземпляра ).

Измените эту декларацию с:

+ (void) openDatabase;

до

- (void) openDatabase;

и создайте экземпляр вашего Database объекта с помощью традиционного alloc + init, и вы уже в пути.

Мне тоже нравится ответ H2CO3 (и +1 к нему), но мой ответ (который большинство людей делают с объектами Objective C) может быть более практичным для того, что вы пытаетесь сделать.

3 голосов
/ 15 января 2012

Нельзя получить доступ к переменным экземпляра из методов класса.Однако вы можете объявить глобальную переменную:

static sqlite3 *database;
// ...
+ (void) openDatabase {
    sqlite3_open(filename, &database);
    // ...
}
2 голосов
/ 15 января 2012

Для справки, static означает разные вещи для разных людей / языков. Objective-C - это, главным образом, C плюс куча улучшений синтаксиса, ключевое слово static в Objective-C имеет то же значение, что и в C, что относится к видимости символа в отношении ссылок. Это немного отличается от того, как в Java и C # используется слово static.

Objective-C не имеет синтаксиса для объявления «статических» (на языке Java / C #) или «классовых» переменных. Среда выполнения «поддерживает» их (свидетельство существования: class_getClassVariable), но нет синтаксиса для их объявления, так что это своего рода тупик. (Если бы мне пришлось угадывать, я бы поспорил, что эта функция существует во время выполнения для поддержки мостов с другими языками / средами исполнения, в которых используются статические / переменные класса.) Как и предполагали другие люди, общий способ обойти это - использовать глобальные переменные. (или статические функции (static в смысле связи C).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...