установить класс делегата в качестве ключа в NSMutableDictionary - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь создать NSMutableDictionary с ключами, состоящими из делегатов UIViewController, например:

-(void) registerAsLocationManagerDelegate:(id<RTALocationManagerDelegate>)lmDelegate forPeriodicUpdates:(NSTimeInterval)seconds 
{
    NSTimer* periodicTimer = [NSTimer scheduledTimerWithTimeInterval:seconds
                                                              target:self
                                                            selector:@selector(runPeriodicUpdates:) 
                                                            userInfo:nil 
                                                             repeats:YES];
    [periodicUpdateDelegates setObject:periodicTimer forKey:lmDelegate];
}

Однако мой код вылетает из-за этой ошибки:

* Завершение работы приложения из-за неисследованного исключения «NSInvalidArgumentException», причина: '- [RTALocationsListViewController copyWithZone:]: нераспознанный селектор, отправленный экземпляру 0x1a9750'

Как-нибудь обойти это?Я делаю что-то совершенно не так, пытаясь это сделать?Должен ли я подойти к этому по-другому?Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Хотя NSDictionary копирует ключи, функции CFDictionary нет.Вместо этого используйте CFDictionary (или воспользуйтесь преимуществом «бесплатной передачи данных»).

0 голосов
/ 18 июня 2011

NSDictionary ключи могут быть любым объектом, если они соответствуют протоколу NSCopying.

Ошибка, которую вы получаете, заключается в том, что она copyWithZone является частью этого протокола и может быть не реализована вашим объектом делегата. - Так что это не может быть ключом.

Вы можете получить строковое представление вашего класса и использовать его в качестве ключа - но это может не сработать, если у вас есть несколько делегатов одного класса (потому что тогда ключи не будут уникальными). Или реализуйте протокол NSCopying в ваших классах делегатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...