Objective-C - 在Initializer方法中访问类方法

时间:2011-06-11 06:05:12

标签: objective-c sqlite

我有一个名为SqliteImageAccess的类,它将提供各种方法来支持某些sqlite功能。我有一个sqlite3类型的本地类变量和一个名为opendb的类方法。这个类方法应该只做一件事。打开数据库。

这里唯一的粘性点是我的sqlite3对象将成为一个实例变量而Objective-C出于任何奇怪的原因,不允许您访问类方法中的实例变量。显然,在其他语言中,当您实例化一个类时,该类的构造函数可能会调用私有方法来初始化一些本地类变量(可能是本地私有变量)。我想通过相当于Objective-C类构造函数方法对我的sqlite3对象做同样的事情。也许有人可以提供帮助,因为我被困在这个问题上。

显然在另一个类中,我可以实例化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 个答案:

答案 0 :(得分:3)

在接口中,您将opendb声明为类方法(+),但您正在使用 - 在实现中。 Normaly你应该得到一个警告,你的类实现是不完整的。将 - 更改为+以实现opendb作为类方法并通过

调用它
[self opendb];

此外,+(void)initilaize只在程序生命周期中被调用一次,认为你想和

一起使用
-(id) init;

再看一下,你的sqlite3属性被声明为一个实例变量,所以你不能从类方法中调用它!您必须将.hite * * db从.h移动到.m文件

static sqlite3 *db;
@implementation之后

答案 1 :(得分:1)

观察:

您已将 .h 中的opendb声明为类方法。

但在.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];

答案 2 :(得分:1)

如果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将对他们可见。

编辑:如果您不想在SqliteImageAccess的所有实例中共享一个db实例,那么您应该将-opendb更改为实例方法,并在类的指定初始化程序中调用它(如-init)。在这种情况下,-opendb当然可以访问实例变量db