iOS - 从NSUserDefaults获取NSDictionary:尝试取消引用无效的ObjC对象或向其发送无法识别的选择器

时间:2014-02-03 17:31:22

标签: ios iphone nsarray nsuserdefaults

我尝试从NSMutableArray中检索已保存的NSUserDefaults

我存储了NSMutableArray

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* mySavedTremps = [[defaults objectForKey:UD_MY_TREMPS] mutableCopy];

if (!mySavedTremps)
        mySavedTremps =[[NSMutableArray alloc] init];

NSMutableDictionary* trempDict = NSMutableDictionary* trempDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"please", @"help", @"me" @"!", nil]
[trempDict setValue:trempId forKey:@"trempId"];
[mySavedTremps insertObject:trempDict atIndex:0];
[defaults setObject:mySavedTremps forKey:UD_MY_TREMPS];

[defaults synchronize];

尝试检索NSMutableArray

NSMutableArray* myTrempsArray = [NSMutableArray arrayWithArray:[defaults objectForKey:UD_MY_TREMPS]];

for (Tremp* tremp in myTrempsArray) {        
        if([tremp.trempId isEqualToString:@"1234"]) {
            [myTrempsArray removeObject:tremp];
            break;
        }
    }

但是,当我访问tremp(for循环中的param)时:

tremp.trempId

我收到此错误:

error: Execution was interrupted, reason: Attempted to dereference an invalid ObjC Object or send it an unrecognized selector.

该过程已返回到表达式评估之前的状态。

1 个答案:

答案 0 :(得分:3)

Tremp对象保存为默认值时,实际上是将其保存为字典。

但是当你读出它时,你的代码假设你有一组Tremp个对象。

你想要这样的东西:

for (NSDictionary *trempDict in myTrempsArray) {
    Tremp *tremp = ... // add code here to create a Tremp from the dictionary
    if([tremp.trempId isEqualToString:@"1234"]) {
        [myTrempsArray removeObject:tremp];
        break;
    }
}
BTW - 这段代码会崩溃。您无法修改快速枚举的数组。将循环更改为标准for循环,但反过来循环。

此外,当您保存数据时,请将对setValue:forKey:的通话替换为setObject:forKey: