iOS-从NSUSERDEFAULTS获取NSDICTIONARY:尝试放置无效的OBJC对象或将其发送为未识别的选择器



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

我存储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 for for循环中)时,例如:

tremp.trempId

我得到此错误:

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

该过程在表达评估之前已返回到州。

当您将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:

最新更新