我使用以下语句调用以下代码: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
}
答案 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]
是为您创建的。这很可爱。