Делегат в синглтоне не будет работать - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть синглтон, который загружает данные из внешней базы данных (PTDatabaseAccsesser). Когда все данные были загружены, синглтон должен вызвать делегата, который является подклассом UITableViewController. Тем не менее, я получаю эту ошибку:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[__NSCFType doneDownloadingData]: unrecognized selector sent to instance... 

Вот как я устанавливаю делегата для подкласса UITableViewController:

- (void)viewDidLoad {

    [[PTDatabaseAccesser sharedInstance] setDelegate:self];
    NSLog(@"%@", [[PTDatabaseAccesser sharedInstance] delegate]);
}

NSLog показывает, что здесь все правильно.

Это код из PTDatabaseAccsesser, который вызывает делегата:

NSLog(@"%@", [self delegate]);
[[self delegate] doneDownloadingData];

NSLog здесь показывает, что делегат того же типа, что и в сообщении об ошибке выше.

Вот как я создаю синглтон:

static PTDatabaseAccesser *sharedInstance;

+ (PTDatabaseAccesser *)sharedInstance {

    @synchronized(self) {

        if (!sharedInstance) sharedInstance = [[PTDatabaseAccesser alloc] init];
    }

    return sharedInstance;
}

+ (id)alloc {

    @synchronized(self) {

        sharedInstance = [super alloc];
    }

    return sharedInstance;
}

Я убедился, что синглтон работает, используя точки останова в двух реализациях метода выше.

1 Ответ

0 голосов
/ 21 сентября 2011

Код в + alloc кажется ненужным и, вероятно, является источником ошибки.Из того, что я вижу, sharedInstance получает свое начальное значение в +alloc, что означает, что ваше условие if в -sharedInstance, вероятно, никогда не выполняется и вы вызываете метод для неинициализированного объекта.Вместо этого попробуйте этот код, который также оказывается более эффективным.

static PTDatabaseAccesser *sharedInstance;

+ (void) initialize
{
   sharedInstance = [[PTDatabaseAccesser alloc] init];
}

+ (PTDatabaseAccesser *)sharedInstance 
{
    return sharedInstance;
}
...