Сбой в функции setObject NSMutableDictionary - PullRequest
0 голосов
/ 27 декабря 2011

Вот мой код:

NSLog(@"dictionaryPlayers=%@,%d",[dictionaryPlayers description],dictionaryPlayers.count);
[dictionaryPlayers setObject:@"test" forKey:@"test2"];

dictionaryPlayers запускается в функции инициализации этого класса:

-(id)init{
  ...
  dictionaryPlayers = [[NSMutableDictionary dictionaryWithCapacity:10]retain];
  ...
}

Сбой программы:

Thread 1:Program received signal: "SIGABRT".

Иconsole:

2011-12-27 17:01:21.744 [25454:207] dictionaryPlayers={
},0
2011-12-27 17:01:21.745 [25454:207] -[__NSCFConstantString tick]: unrecognized selector sent to instance 0x199bcc

С выходами NSLog я думаю, что DictionaryPlayers хорошо проработан.Поэтому я не знаю, почему разбился ...

Ответы [ 4 ]

2 голосов
/ 27 декабря 2011

Объект, для которого вы вызываете тик: больше не находится в памяти и вызывает этот сбой.Попытайтесь понять, почему этот объект выпущен.

0 голосов
/ 28 декабря 2011

Я удалил

dictionaryPlayers = [NSMutableDictionary dictionaryWithCapacity:10]; 

из init () и добавил

dictionaryPlayers = [[NSMutableDictionary alloc] init];

над моим оператором журнала.Все еще сбой .... Затем я удалил

[dicTest setValue:@"Test" forKey:@"testKey"];

Так что осталось только 2 строки:

dictionaryPlayers = [[NSMutableDictionary alloc] init];
NSLog(@"dictionaryPlayers=%@,%d",[dictionaryPlayers description],dictionaryPlayers.count);

Он не вылетел.Так что, похоже, проблема в строке setValue.

0 голосов
/ 28 декабря 2011

Вам не нужно вызывать retain для объекта в вашем выражении init.Также просто для хихиканья попробуйте:

dictionaryPlayers = [[NSMutableDictionary alloc] init];

вместо

dictionaryPlayers = [NSMutableDictionary dictionaryWithCapacity:10];

И сделайте это прямо над вашим лог-оператором (выведите его из инициализации).

Еслиэто работает, поместите журнал в ваш метод init и убедитесь, что он вызывается перед вашим методом, который добавляет KV в словарь

Я не могу воспроизвести это поведение.Вот мой код: ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property(nonatomic, retain) NSMutableDictionary *dictionaryPlayers;
@property (retain, nonatomic) IBOutlet UITextView *logTextView;
- (IBAction)logButtonPressed:(id)sender;
@end

ViewController.m:

#import "ViewController.h"

@implementation ViewController
@synthesize dictionaryPlayers;
@synthesize logTextView;


#pragma mark - My Methods
- (IBAction)logButtonPressed:(id)sender {
    logTextView.text = [NSString stringWithFormat:@"%@,%d",[dictionaryPlayers description],[dictionaryPlayers count]];
    NSLog(@"dictionaryPlayers=%@,%d",[dictionaryPlayers description],[dictionaryPlayers count]);
}

#pragma mark - View lifecycle
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    dictionaryPlayers = [[NSMutableDictionary alloc] init];


    [dictionaryPlayers setValue:@"Test" forKey:@"testKey"];
    NSLog(@"dictionaryPlayers=%@,%d",[dictionaryPlayers description],[dictionaryPlayers count]);
}

Нет проблем.Если вы делаете вещи таким образом, у вас не может быть проблем.Вот шаги, которые я бы предпринял для устранения неполадок:

  1. Выполните поиск проекта для PlayersDictionary и убедитесь, что больше ничего не трогает этот объект.
  2. Попробуйте очистить проект
  3. Создайте новый проект с этой структурой и посмотрите, что произойдет
0 голосов
/ 27 декабря 2011

Кажется, что это не локальный случай, так что вы обязательно синтезировали его сверху?И правильно заявили в шапке?Примеры: В заголовке:

@property (nonatomic, strong) NSMutableDictionary *dictionaryPlayers;

в классе:

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