iphone - 从文件取消归档时 NSOrderedSet addObject 出现问题

标签 iphone objective-c set

我一直在网上到处搜索,并尝试了迄今为止我能想到的一切,但都无济于事。这是我的问题: 在我的程序中,我有一个名为 Scale 的类,Scale 有几个属性。用户可以通过单击名为 addScale 的按钮向 tableView 添加比例。当按下 addScale 时,我将其添加到 OrderedMutableSet 中。我使用该集合来存储秤并防止重复秤。我必须重写 isEqual 方法和 Hash 方法来欺骗计算机,让计算机认为两个具有相同属性的 Scale 完全相同。这很好用。但是,当我打开应用程序并且之前在 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 方法的代码: (主音、调式、节奏、 Octave 和节奏均为整数)

- (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,NSOrderedMutableSet 是存储所有比例的地方。

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

谢谢,

K

最佳答案

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

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

关于iphone - 从文件取消归档时 NSOrderedSet addObject 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7233690/

相关文章:

iphone - 为宏使用未声明的标识符

iphone - 为什么 NSFetchedResultsController PerformFetch : crashing when recreating an NSFetchedResultsController with an equivalent NSFetchRequest?

iphone - 有没有办法在不进行硬编码的情况下缩短我的 Country ViewController.m?

ios - 允许使用仅纵向应用的横向视频

python - 为什么不能 unpickled 这个 set 子类的实例?

java - 从数组中删除重复项。打印 HashMap 时出错

iphone - 如何删除ios中的导航栏?

objective-c - 根据indexPath.row移动tableview

objective-c - 自动将属性值从一个对象复制到另一个类型不同但协议(protocol)相同的对象(Objective-C)

java - 将 Set<String> 的内容放入单个字符串的最快方法,其中单词用空格分隔?