0

我有一个方法应该采用 NSManagedObject,将其属性复制到字典中,然后使用 NSManagedObjectID 键将字典添加到静态 NSMutableDictionary 中的 NSMutableArray 中。问题是当我尝试添加到静态 NSMutableDictionary 时它会崩溃,并且只有当我当场制作一个时才有效。

该问题肯定与静态 NSMutableDictionary 更改有关,因为如果我使用非静态字典,我不会得到异常。它是这样定义的(在@implementation 上方):

static NSMutableDictionary* changes = nil;

这是方法:

+ (void)acceptChange: (NSManagedObject *)change{
if (!changes){
    NSLog(@"Making new changes dicitonary"); //it prints this when I run
    changes = [[NSDictionary alloc] init];
}
NSManagedObjectID* objectID = change.objectID;
NSMutableArray* changeArray = [changes objectForKey: objectID];
bool arrayDidNotExist = NO;
if (!changeArray){
    changeArray = [[NSMutableArray alloc] init];
    arrayDidNotExist = YES;
}
[changeArray addObject: [(this class's name) copyEventDictionary: change]]; //copies the NSManagedObject's attributes to an NSDictionary, assumedly works
if (arrayDidNotExist) [changes setObject: changeArray forKey: objectID];//throws the  exception

//If I do the exact same line as above but do it to an [[NSMutableDictionary alloc] init] instead of the static dictionary changes, it does not throw an exception.

if (arrayDidNotExist) NSLog(@"New array created");
NSLog(@"changeArray count: %d", changeArray.count);
NSLog(@"changes dictionary count: %d", changes.count);

}

确切的异常消息是这样的:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0xa788e30'
4

3 回答 3

1

使用NSMutableDictionary而不是NSDictionary. 你得到异常是因为,NSMutableDictionary 可以动态修改, NSDictionary 不能。.

NSMutableDictionary是 的子类NSDictionary。所以所有的方法NSDictionary都可以通过NSMutableDictionary对象访问。此外NSMutableDictionary还添加了补充方法来动态修改事物,例如方法setObject:forKey:

编辑

您已经使用NSDictionary而不是`NSMutableDictionary 对其进行了初始化。

if (!changes){
    NSLog(@"Making new changes dicitonary"); //it prints this when I run
    //changes = [[NSDictionary alloc] init]; 
                ^^^^^^^^^^^^^^ ------------------> Change this. 
    changes = [[NSMutableDictionary alloc] init];
}
于 2013-07-29T04:30:31.920 回答
1

[__NSDictionaryI setObject:forKey:]表明您的字典是不可变的。您实际上是在将您的字典初始化为不可变的。这就是为什么它在添加对象时引发异常。

这里改变这一行:

if (!changes){
   ....
    changes = [[NSDictionary alloc] init];
}

到:

if (!changes){
    ....
    changes = [[NSMutableDictionary alloc] init];
}
于 2013-07-29T04:48:39.753 回答
1

您将字典声明为 NSMutableDictionary,因此在编译时您的字典是 NSMutable 字典,但在运行时它是 NSDictionary,因为您将其分配为 NSDictionary,您无法对其进行更改,因此例外。请将字典定义为:-

更改 = [[NSMutableDictionary alloc] init];

如果您阅读异常的描述,它会说同样的事情。

希望这可以帮助。

于 2013-07-29T05:01:41.953 回答