У меня проблема с одноэлементным шаблоном.
Я прочитал следующие уроки о синглтон-классах и создал свой собственный.http://www.galloway.me.uk/utorials/singleton-classes/ http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/
При первом создании и запуске приложения оно работает так, как должно.Никаких проблем!Но когда я перестраиваю приложение, синглтон-класс больше не работает должным образом.Первый init работает так, как и должен, но когда я вызываю его снова после нажатия кнопки, происходит сбой моего приложения.
Мой класс синглтона:
BPManager.h
@interface BPManager : NSObject {
NSString *dbPath;
}
@property (nonatomic, retain) NSString *dbPath;
+ (id)bpManager;
- (void)initDatabase:(NSString *)dbName;
- (int)getQuestions;
@end
BPManager.m
static BPManager *sharedMyManager = nil;
@implementation BPManager
@synthesize dbPath;
- (void)initDatabase:(NSString *)dbName
{
dbPath = dbName;
}
-(int)getQuestions
{
NSLog(@"getQuestions");
}
- (id)init {
if ((self = [super init])) {
}
return self;
}
+ (BPManager *) bpManager {
@synchronized(self) {
if(sharedMyManager != nil) return sharedMyManager;
static dispatch_once_t pred; // Lock
dispatch_once(&pred, ^{ // This code is called at most once per app
sharedMyManager = [[BPManager alloc] init];
});
}
return sharedMyManager;
}
- (void)dealloc {
[dbPath release];
[super dealloc];
}
Когда я вызываю следующий код при создании моего интерфейса, приложение создает синглтон:
BPManager *manager = [BPManager bpManager];
[manager initDatabase:@"database.db"];
Примечание. На этом этапе я могу создавать ссылки на классиз других файлов.Но когда я нажимаю на кнопку, он теряет свои ссылки.
Но при нажатии на кнопку следующий код завершается:
BPManager *manager = [BPManager bpManager];
int count = [manager getQuestions];
Приложение должно получить sharedInstance.Это работает, только параметры (например, dbPath) не доступны.Почему это так?
Редактировать:
после некоторых исследований я изменил метод на:
+ (BPManager *) bpManager {
@synchronized(self) {
if(sharedMyManager != nil) return sharedMyManager;
static dispatch_once_t pred; // Lock
dispatch_once(&pred, ^{ // This code is called at most once per app
sharedMyManager = [[BPManager alloc] init];
});
}
return sharedMyManager;
}
Но проблема не решена