是什么导致了这个?

时间:2011-03-10 16:35:34

标签: objective-c xcode

我不明白“为什么”SQLiteDB可能无法响应“-checkIfDatabaseExists”。造成这种情况的原因是什么?如何解决? (我真的很接近让这个工作,但因为我是一个新手,我仍然有问题)。

我感谢我能得到的任何帮助。这是代码:

#import "SQLiteDB.h"

static SQLiteDB *sharedSQLiteDB = nil;  //  makes this a singleton class

@implementation SQLiteDB

@synthesize db, dbPath, databaseKey;


//--------------    check for database or create it    ----------------|
#pragma mark Singleton Methods

+ (SQLiteDB *) sharedSQLiteDB  {

    if(!sharedSQLiteDB)  {
        sharedSQLiteDB = [[SQLiteDB alloc] init];
        [sharedSQLiteDB checkIfDatabaseExists];
    }
    return sharedSQLiteDB;
}   

+(id)allocWithZone:(NSZone *)zone  {
    if(!sharedSQLiteDB)  {
        sharedSQLiteDB = [super allocWithZone:zone];
        return  sharedSQLiteDB;
    }
    else {
        return nil;
    }
}   

-(id)copyWithZone:(NSZone *)zone  {
    return self;
}

-(void) release  {
    //  no-op
}


- (void) checkIfDatabaseExists  {
    // Get the path to the database file
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString *databasePath = [documentPath stringByAppendingPathComponent:@"ppcipher.s3db"];

    // Open the database file
    const char *cDatabasePath = [databasePath cStringUsingEncoding:NSUTF8StringEncoding];
    if(sqlite3_open(cDatabasePath, &db) == SQLITE_OK)  //  does it exist?
        return;
    else {  //  create database file here

    }

}
@end

Here is the results of the build:

2 个答案:

答案 0 :(得分:0)

我不是百分之百确定你在这里实现了什么,但据我所知,你的标题已经定义了+ checkIfDatabaseExists作为类方法(虽然你还没有实现它,因此“不完整的实现“和”方法定义未找到“警告”。但是,在您的sharedSQLiteDB方法中,您在SQLiteDB的实例上调用-checkIfDatabaseExists,该实例引用您尚未定义的实例方法。

编辑:好的,看到完整的代码后,我的上述答案显然不是这样。但你的标题是什么样的?在checkIfDatabaseExists签名前面有+而不是 - 吗?

答案 1 :(得分:0)

当你有:

- (void) foo
{
   [self bar];
}

- (void) bar
{ ... }

编译-bar时,编译器没有看到-foo的定义,因此会在编译{{1}时警告self可能不响应-bar }}。

如果该方法对于类是完全私有的,那么在.m文件的顶部执行此操作:

-foo

如果要由其他类调用,请将方法声明添加到@interface Foo() - (void) bar; @end