从文件解压缩时NSOrderedSet addObject的问题

时间:2011-08-29 17:39:36

标签: iphone objective-c set

我一直在网上搜索并尝试到目前为止我能想到的一切都无济于事。这是我的问题: 在我的程序中,我有一个名为Scale的类,Scale有几个属性。用户可以通过单击名为addScale的按钮将比例添加到tableView。按下addScale时,我将其添加到OrderedMutableSet。我使用该集来存储比例并防止重复比例。我不得不重写isEqual方法和Hash方法来欺骗计算机,以为两个具有相同属性的Scales完全相同。这很好用。但是当我打开应用程序并且之前在tableView中有一些比例时,我已经实现了归档,因此这些比例重新出现,正如预期的那样。这次,当按下addScale时,我得到一个例外:

    -[__NSOrderedSetI addObject:]: unrecognized selector sent to instance 0x746dbf0
    2011-08-29 13:20:49.095 MusicLog[678:f203]
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
    reason: '-[__NSOrderedSetI addObject:]: unrecognized selector sent to instance 0x746dbf0'

这是我的isEqual方法和我的Hash方法的代码: (音调,模式,节奏,八度音和节奏都是整数)

- (NSUInteger)hash
{
    NSUInteger prime = 31;
    NSUInteger result = 1;
    result = prime * result + tonic;
    result = prime * result + mode;
    result = prime * result + rhythm;
    result = prime * result + octaves;
    result = prime * result + tempo;
    NSLog(@"%u", result);
    NSLog(@"%u", NSUIntegerMax);

    return result;
}


- (BOOL)isEqual:(Scale *)object
{
    if ((tonic == [object tonic])
        && (mode == [object mode])
        && (rhythm == [object rhythm])
        && (octaves == [object octaves])
        && (tempo == [object tempo]))
        return YES;
    else 
        return NO;
}

以下是我的addScale方法的代码:

- (IBAction)addScale:(id)sender
{
    Scale *chosenScale = [[Scale alloc] init];
    [chosenScale setTonic:[myPicker selectedRowInComponent:0]];
    [chosenScale setMode:[myPicker selectedRowInComponent:1]];
    [chosenScale setRhythm:[myPicker selectedRowInComponent:2]];
    [chosenScale setOctaves:[octavesSegmentedControl selectedSegmentIndex] + 1];
    [chosenScale setTempo: (int) [tempoStepper value]];
    [[ScaleStore defaultStore] addScale:chosenScale];
}

ScaleStore的addScale方法只是从NSOrderedMutableSet调用addObject,这是存储所有比例的地方。

非常感谢您提供的任何帮助。

谢谢,

ķ

1 个答案:

答案 0 :(得分:7)

当您取消归档时,对象将恢复为不可变版本(NSMutableSet变为NSSet,NSMutableArray变为NSArray等)。

只需使用已恢复集中的对象创建一个新的NSOrderedMutableSet。