Objective-C - Доступ к методам класса внутри метода Initializer - PullRequest
0 голосов
/ 11 июня 2011

У меня есть класс с именем SqliteImageAccess, который будет иметь различные методы, обеспечивающие поддержку некоторых функций sqlite.У меня есть локальная переменная класса типа sqlite3 и метод класса с именем opendb.Этот метод класса должен делать только одно и только одно.Откройте базу данных.

Единственный неприятный момент здесь заключается в том, что мой объект sqlite3 будет переменной экземпляра, а Objective-C, по какой-то странной причине, не позволяет вам обращаться к переменным экземпляра внутри методов класса.Очевидно, что в других языках, когда вы создаете экземпляр класса, конструктор этого класса может вызывать закрытый метод для инициализации некоторых локальных переменных класса (возможно, локальной закрытой переменной).Я хочу сделать то же самое с моим объектом sqlite3 через эквивалент метода конструктора класса Objective-C.Возможно, кто-то может помочь, потому что я застрял на этом.

Очевидно, что в другом классе я могу создать экземпляр класса SqliteImageAccess, а затем вызвать метод opendb.Это отлично работает.Я не хочу этого делать.Когда я создаю экземпляр класса, цель состоит в том, чтобы класс автоматически обрабатывал открытие базы данных.

Наконец, с другими методами, которые будут доступны для выполнения другой работы sqlite (вставки и т. Д.), Мне понадобится полный доступ к объекту db.заранее спасибо за любую помощь.

// SqliteImageAccess.h

@interface SqliteImageAccess : NSObject {



}

+(void)opendb; //class method

@end

// SqliteImageAccess.m

#import "SqliteImageAccess.h"


@implementation SqliteImageAccess

static sqlite3 *db;

+(void)initialize{
    [self opendb];
}

+(void)opendb{
int open = sqlite3_open("/Users/csmith/RPG/cws.sqlite3", &db);
if(open == SQLITE_OK){
    NSLog(@"Database was opened successfully");
}
else {
    NSLog(@"open result = %d", open);
}

}

@end

Ответы [ 3 ]

3 голосов
/ 11 июня 2011

В интерфейсе вы объявляете opendb как метод класса (+), но вы используете - в реализации.Обычно вы должны получить предупреждение, что реализация вашего класса не завершена.Измените - на +, чтобы реализовать opendb как метод класса и вызвать его через

[self opendb];

Кроме того, + (void) initilaize вызывается только один раз в течение жизненного цикла программы, думая, что вы хотели бы использовать

-(id) init;

Увидев еще одну вещь, ваше свойство sqlite3 объявлено как переменная экземпляра, поэтому вы не можете вызвать его из метода класса!Вы должны переместить sqlite3 * db из .h в файл .m как

static sqlite3 *db;

после @ реализации.

1 голос
/ 11 июня 2011

Если все экземпляры SqliteImageAccess собираются совместно использовать один и тот же экземпляр БД (sqlite3 *), то вы можете объявить его глобально, вместо того, чтобы объявлять его как переменную экземпляра:

// SqliteImageAccess.m

@implementation SqliteImageAccess

// 'db' will be shared by all instances of SqliteImageAccess
static sqlite3 *db;

+ (void)initialize {
    if (self == [SqliteImageAccess class]) {
        opendb(&db); // assumes opendb is a function, not a method
    }
}

Если вы создадите все методы экземпляра SqliteImageAccess в этом файле, им будет виден db.

РЕДАКТИРОВАТЬ: если вы не хотите совместно использовать один db экземпляр среди всех экземпляров SqliteImageAccess, то вам следует заменить -opendb на метод экземпляра и вызвать его в указанном инициализаторе вашего класса (например, -init) , В этом случае, конечно, -opendb будет иметь доступ к переменной экземпляра db.

1 голос
/ 11 июня 2011

наблюдение:

вы объявили opendb в .h как метод класса.

Но в классе .m вы используете его как метод экземпляра.

+(void)opendb{
int open = sqlite3_open("/Users/csmith/RPG/cws.sqlite3", &db);
if(open == SQLITE_OK){
    NSLog(@"Database was opened successfully");
}
else {
    NSLog(@"open result = %d", open);
}

}

Предложите вам связываться как с вашим экземпляром (объектом класса), так и явным образом отправлять сообщение opendb извне вашего класса всякий раз, когда вы создаете экземпляр своего класса доступа к базе данных.


- (void) init {
    if (self = [super init]) {

       //initialize all your class member here,

    }
}

И функция вашего экземпляра opendb

 - (void)opendb{
    int open = sqlite3_open("/Users/csmith/RPG/cws.sqlite3", &db);
    if(open == SQLITE_OK){
        NSLog(@"Database was opened successfully");
    }
    else {
        NSLog(@"open result = %d", open);
    }

    }

Теперь давайте создадим экземпляр класса доступа sqllite3.

SqliteImageAccess*  smySqliteImageAccess = [SqliteImageAccess  alloc] init];
[smySqliteImageAccess opendb];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...