Цель C / NSMutableDictionary - [NSCFSet objectForKey:]: нераспознанный селектор - PullRequest
1 голос
/ 27 марта 2011

Я не понимаю, что я делаю не так.У меня есть словарь как свойство одноэлементного класса:

@interface CABResourceManager : NSObject
{
.... 
    NSMutableDictionary* soundMap;
}
@property (retain) NSMutableDictionary *soundMap;

Затем я добавляю объект в этот словарь одним методом класса:

+ (void)loadSoundFromInfo:(ABSoundInfo)sound
{
    static unsigned int currentSoundID = 0;
    CABSound* newSound = [[CABSound alloc] initWithInfo:(ABSoundInfo)sound soundID:++currentSoundID];
    [[CABResourceManager sharedResMgr].soundMap setObject:newSound forKey:sound.name];
}

И пытаюсь получить его в другомметод:

+ (ALuint)playSoundByName:(NSString*)name
{
    NSMutableDictionary* map = [CABResourceManager sharedResMgr].soundMap;
    CABSound *sound = [map objectForKey:name];   // here comes the exception

, и приложение закрывается в этом случае при исключении.

2011-03-27 20:46:53.943 Book3HD-EN[5485:207] *** -[NSCFSet objectForKey:]: unrecognized selector sent to instance 0x226950
2011-03-27 20:46:53.945 Book3HD-EN[5485:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException'

Я полагаю, что это может иметь что-то с управлением памятью, но здесь мне кажется, что объект CABSoundсохраняется в словаре с помощью setObject (), в настоящее время его не следует выпускать.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Я бы проверил, что soundMap правильно инициализирован.Похоже, что SoundMap - плохой указатель в тот момент, когда вы получаете ошибку.В + loadSoundFromInfo может произойти ноль, что сразу не приведет к ошибке.

0 голосов
/ 27 марта 2011

Убедитесь, что вы инициализировали вашу звуковую карту в назначенном инициализаторе:

// - (id) init... or something else
soundMap = [[NSMutableDictionary alloc] init];

Не забудьте переопределить реализацию по умолчанию для dealloc:

// class implementation file
- (void)dealloc {
  [soundMap release];
  //...release other objects you own...
  [super dealloc];
}
...