单身人士没有正确初始化

时间:2011-04-29 16:32:15

标签: objective-c sqlite

我使用以下语句调用以下代码:SQLiteDB * db = [[[SQLiteDB alloc] init] autorelease];

问题是“sharedSQLiteDB”没有被调用,而是“allocWithZone”,因此没有调用“checkIfDatabaseExists”,这是创建数据库的地方。

我不明白为什么......(即我做错了什么?)

#import "SQLiteDB.h"

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

@implementation SQLiteDB

@synthesize searchPaths, documentPath, databasePath, cDatabasePath;

#pragma mark Singleton Methods

+ (SQLiteDB *) sharedSQLiteDB  {

    if(!sharedSQLiteDB)  {
        sharedSQLiteDB = [[SQLiteDB alloc] init];
        [sharedSQLiteDB checkIfDatabaseExists];  //  check to see if d/b exists
    }
    return sharedSQLiteDB;
}   

+(id)allocWithZone:(NSZone *)zone  {  //  makes sure another instance is not allocated
    if(!sharedSQLiteDB)  {
        sharedSQLiteDB = [super allocWithZone:zone];
        return  sharedSQLiteDB;
    }
    else {
        return nil;
    }
}   

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

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

4 个答案:

答案 0 :(得分:1)

在单身模式中,您的使用模式应为:

SQLiteDB* db = [SQLiteDB sharedSQLiteDB];

他们称你的方式不符合singelton模式。所有访问都应该通过您的sharedSQLiteDB消息。

换句话说,你不应该在类的范围之外通过典型的Cocoa模式(SQLiteDB * db = [[[SQLiteDB alloc] init] autorelease];不正确且充满问题)进行初始化。

在使用语言的默认初始化模式(ObjC的alloc / init或C ++的默认构造函数)的单例中,应该生成编译时错误消息,因为构造函数/ init方法应该受到保护。

请参阅Wikipedia条目。参考Design Pattern C ++圣经。甚至还有Cocoa

的版本 祝你好运。

答案 1 :(得分:0)

它没有执行你的+ (SQLiteDB *) sharedSQLiteDB方法,因为你实际上并没有在任何地方调用该方法。

如您所见,当您致电[[SQLiteDB alloc] init]时,会调用allocWithZone方法。

将您的通话更改为SQLiteDB *db = [SQLiteDB sharedSQLiteDB],在这种情况下会调用您的checkIfDatabaseExists方法。但是,如果在其他地方调用[[SQLiteDB alloc] init],则仍会跳过checkIfDatabaseExists方法调用。

也许可以考虑将checkIfDatabaseExists方法移到init方法中,以便为您的单例方法和allocWithZone调用它。

答案 2 :(得分:0)

老实说,我没有看到任何错误...... 但是我发布了用于创建Singleton的代码。它来自一个来源,现在我不记得链接...这不是我的代码。

static DataManager *_instance;

@implementation DataManager

+ (DataManager*)sharedInstance
{
    @synchronized(self) {

        if (_instance == nil) {

            _instance = [[super allocWithZone:NULL] init];

            // Allocate/initialize any member variables of the singleton class her
            // example
    //_instance.member = @"";
        }
    }
    return _instance;
}

#pragma mark Singleton Methods

+ (id)allocWithZone:(NSZone *)zone
{   
    return [[self sharedInstance]retain];   
}


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

- (id)retain
{   
    return self;    
}

- (unsigned)retainCount
{
    return NSUIntegerMax;  //denotes an object that cannot be released
}

- (void)release
{
    //do nothing
}

- (id)autorelease
{
    return self;    
}

我希望它有所帮助

答案 3 :(得分:0)

我强烈建议您使用Matt Gallagher首次创建的SyntesizeSingleton头文件。

在这里找到最新版本(我知道):

https://github.com/cjhanson/Objective-C-Optimized-Singleton

这使得创建单身人士变得简单。

这是一个示例标题:

#import <Foundation/Foundation.h>
@interface Example : NSObject {}
+(Example*)sharedExample;
@end

和相应的.m:

#import "FMUser.h"
#import "SynthesizeSingleton.h"
@implementation Example
SYNTHESIZE_SINGLETON_FOR_CLASS(Example);
@end

[Example sharedExample]是为您创建的。这很可爱。