NSMutableDIctionary setObject: сбой ForKey, когда ключ является членом объекта

Я пытаюсь использовать NSMutableDictionary для сопряжения объекта моих пользовательских классов с UIButton в качестве его ключа. UIButton, который является ключом, также является членом объекта, который я хочу сохранить как объект в NSMutableDictionary.

Определение моего класса выглядит так:

@interface ClassA : NSObject {
@public
    UIButton *button1;
    UIButton *button2;
    UILabel *label;
}

@property (nonatomic, retain) UIButton *button1;
@property (nonatomic, retain) UIButton *button2;
@property (nonatomic, retain) UILabel *label;
@end

И моя реализация такова:

@implementation ClassA
@synthesize button1, button2, label;
@end

NSMutableDictionary находится в другом классе. Я определяю это в реализации следующим образом:

@interface UIClass1 : UIViewController {
    NSMutableDictionary *Dictionary;
}

-(void)DoWork;

@property (nonatomic, retain) NSMutableDictionary *Dictionary;
@end

И часть, где я пытаюсь установить значения словаря, делается здесь:

-(void)DoWork{
    Dictionary = [[NSMutableDictionary alloc] init];
    ObjectA = [[ClassA alloc] init];

    ObjectA->button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    ObjectA->button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    ObjectA->label = [[[UILabel alloc] initWithFrame:CGRectMake(20, 20, 20, 20)] autorelease]

    /* THIS IS A TEST AND IT WORKS FINE */
    NSString *str = [[NSString alloc] initWithFormat:@"test"];
    [Dictionary setObject:obj1 forKey:str];

    /*THIS IS WHAT I WOULD ACTUALLY LIKE TO DO */
    [Dictionary setObject:Object1 forKey:ObjectA->button1];
    [Dictionary setObject:ObjectA forKey:ObjectA->button2];
}

Я выполнил этот код через свой отладчик, и когда я дошел до этой строки:

[Dictionary setObject:Object1 forKey:ObjectA->button1];

Просто вылетает SIGABRT. Ни одна из моих переменных не равна нулю, каждый объект был выделен.

Любые идеи относительно того, почему я не могу установить ключ на кнопку из ClassA, но я могу установить его в NSString, который я создал в качестве теста?


person Vince613    schedule 09.11.2011    source источник
comment
Эй, мужик, просто быстрое предложение: сделайте свои переменные в верблюжьем регистре!   -  person 0xSina    schedule 09.11.2011
comment
Хотя это и не обязательно, почти весь другой исходный код Objective-C использует соглашение lowerCamelCase как для переменных, так и для методов, и UpperCamelCase для имен классов. Вы можете пойти против условностей, но обычно это нежелательно.   -  person dreamlax    schedule 09.11.2011
comment
Я на самом деле следую этому соглашению, приведенный выше код не является моим настоящим кодом, а просто макетом того, что я делаю.   -  person Vince613    schedule 10.11.2011


Ответы (2)


Объект, который вы используете в качестве ключа в NSMutableDictionary, должен соответствовать протоколу NSCopying.

Из документов Apple:

Ключ к значению. Ключ копируется (используя copyWithZone:; ключи должны соответствовать протоколу NSCopying). Ключ не должен быть нулевым.

UIButton не соответствует NSCopying.

person XJones    schedule 09.11.2011
comment
Ах хорошо, это объясняет вещи. Спасибо. Есть ли где-нибудь список, в котором указано, какие объекты безопасно использовать в качестве ключа с NSMutableDictionary. - person Vince613; 09.11.2011
comment
Я не знаю списка объектов платформы iOS, которые поддерживают NSCopying, но в документах для каждого объекта указано, какие протоколы они поддерживают. - person XJones; 09.11.2011
comment
Вы можете использовать объект NSValue. Попробуйте [значение NSValueWithUnretainedObject:ObjectA.button1] - person Pierre; 09.11.2011
comment
Я предполагаю, что вы имели в виду значениеWithNonretainedObject, которое действительно сработало. Спасибо за большую помощь. - person Vince613; 09.11.2011
comment
Да, я имел в виду значениеWithNonretainedObject: - person Pierre; 09.11.2011

Попробуйте использовать

forKey:[NSValue valueWithPointer:ObjectA->button1]
person JayAr    schedule 16.01.2012