2014-10-09 84 views
0

我有一个应用程序,我在viewControllers与NSUserDefaults之间传递一些数据。NSUserDefaults setObject方法导致应用程序崩溃在ios8

这是我正在使用的代码。

[[NSUserDefaults standardUserDefaults]setObject:selectedLists forKey:UserID]; 

selectedLists的NSMutableArray和用户ID是的NSString

此代码正常工作,直到ios7和xCode5。

因为我更新了xCode6,现在我使用的是ios8,所以我的应用在xCode 6和ios 7.1上运行正常,但是当我在ios8设备中运行该应用时,该应用崩溃,出现以下错误。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0x7a027060' 

我只是不明白这里有什么问题。

如果有人遇到了ios8的这个问题,那么请帮助我。

在此先感谢。

selectedLists

{ 
     CardFace = Word; 
     ImportFlag = Import; 
     ListID = 1; 
     ListName = "Adjectives - Appearance"; 
     QuizBy = Definition; 
     UserID = 1; 
    } 

和用户ID值是1

EDITED

*** First throw call stack: 
    (
     0 CoreFoundation      0x06a24df6 __exceptionPreprocess + 182 
     1 libobjc.A.dylib      0x03ac8a97 objc_exception_throw + 44 
     2 CoreFoundation      0x06a2ca75 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277 
     3 CoreFoundation      0x069759c7 ___forwarding___ + 1047 
     4 CoreFoundation      0x0697558e _CF_forwarding_prep_0 + 14 
     5 CoreFoundation      0x068df30f CFStringGetLength + 143 
     6 CoreFoundation      0x069de510 _CFPrefsEncodeKeyValuePairIntoMessage + 64 
     7 CoreFoundation      0x06a275cf -[CFPrefsPlistSource sendMessageSettingValue:forKey:] + 111 
     8 CoreFoundation      0x06954f3a -[CFPrefsPlistSource alreadylocked_setValue:forKey:] + 250 
     9 CoreFoundation      0x06954e22 -[CFPrefsSource setValue:forKey:] + 82 
     10 CoreFoundation      0x06954dc3 ___CFPreferencesSetValueWithContainer_block_invoke + 51 
     11 CoreFoundation      0x0690ef0a +[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:] + 1274 
     12 CoreFoundation      0x06954d61 _CFPreferencesSetValueWithContainer + 225 
     13 CoreFoundation      0x06a0aa62 _CFPreferencesSetAppValueWithContainer + 66 
     14 Foundation       0x0347f53f -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 59 
     15 Foundation       0x0353eeba -[NSUserDefaults(NSKeyValueCoding) setValue:forKey:] + 68 
     16 Vocab        0x000eaecc Vocab + 720588 
     17 libobjc.A.dylib      0x03ade7cd -[NSObject performSelector:withObject:withObject:] + 84 
     18 UIKit        0x022a079d -[UIApplication sendAction:to:from:forEvent:] + 99 
     19 UIKit        0x022a072f -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64 
     20 UIKit        0x023d3a16 -[UIControl sendAction:to:forEvent:] + 69 
     21 UIKit        0x023d3e33 -[UIControl _sendActionsForEvents:withEvent:] + 598 
     22 UIKit        0x023d309d -[UIControl touchesEnded:withEvent:] + 660 
     23 UIKit        0x022f0aba -[UIWindow _sendTouchesForEvent:] + 874 
     24 UIKit        0x022f1595 -[UIWindow sendEvent:] + 791 
     25 UIKit        0x022b6aa9 -[UIApplication sendEvent:] + 242 
     26 UIKit        0x022c68de _UIApplicationHandleEventFromQueueEvent + 20690 
     27 UIKit        0x0229b079 _UIApplicationHandleEventQueue + 2206 
     28 CoreFoundation      0x069487bf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
     29 CoreFoundation      0x0693e2cd __CFRunLoopDoSources0 + 253 
     30 CoreFoundation      0x0693d828 __CFRunLoopRun + 952 
     31 CoreFoundation      0x0693d1ab CFRunLoopRunSpecific + 443 
     32 CoreFoundation      0x0693cfdb CFRunLoopRunInMode + 123 
     33 GraphicsServices     0x0436424f GSEventRunModal + 192 
     34 GraphicsServices     0x0436408c GSEventRun + 104 
     35 UIKit        0x0229ee16 UIApplicationMain + 1526 
     36 Vocab        0x0004c9bc Vocab + 72124 
     37 libdyld.dylib      0x03ee6ac9 start + 1 
    ) 
    libc++abi.dylib: terminating with uncaught exception of type NSException 

编辑 在我的tableview的didselect方法...

UserID = [[users objectAtIndex:indexPath.row] valueForKey:@"UserID"]; 

其中用户是一个数组。

+0

什么样的对象类型是selectedLists和UserID? – EridB 2014-10-09 07:45:05

+0

我建议你设置一个异常断点或者检查堆栈跟踪来确认它实际上崩溃的那一行 – Paulw11 2014-10-09 07:46:16

+1

另外,NSUserDefaults可能不是在对象之间传递数据的最有效的方式 - 'NSNotificationCenter'是更好的选择 – Paulw11 2014-10-09 08:00:29

回答

1

您应该检查用户ID类型,因为崩溃与将NSArray更改为NSMutableArray无关。

您必须使用的NSString你的用户ID是混乱的NSNumber:

更改您的代码,并代替用户ID使用变量userIDString

NSString userIDString; 

//If UserID is class of NSNumber turn its value to NSString 
if ([UserID isKindOfClass:[NSNumber class]]) 
{ 
    userIDString = [UserID stringValue]; 
} 
else 
    userIDString = UserID ; 
+0

我已经使用NSLogs编辑了我的问题。 – Manthan 2014-10-09 09:21:38

+0

@Manthan你不能将自定义对象的NSMutableArray存储到userDefaults。你需要把它表示为NSData。我编辑我的答案。 – EridB 2014-10-09 09:24:36

+0

好的谢谢...但它适用于ios6和ios7,那么为什么这个问题只适用于ios8? – Manthan 2014-10-09 09:27:46

0

我认为不能存储NSMutableArraysNSUserDefaults自iOS8以来(根据不同的职位)。尝试将其转换为数组之前(或创建一个新的)。

喜欢本作例子:

NSArray *arr = [NSArray arrayWithArray:selectedLists]; 

和存储arrNSUserDefaults

+0

您可以将NSMutableArray存储到NSUserDefaults中,但是当您得到它时,该数组不是可变对象,因此您必须创建一个新对象。 – EridB 2014-10-09 07:50:33

+0

我已经在应用程序中完全相同的崩溃,并使用NSArray解决了我的问题 – 2014-10-09 07:50:47

+0

@Zil阅读我的评论和Paulw11的评论 – EridB 2014-10-09 07:51:50

0

尝试编码您的数据到NSData,并将其保存在NSUserDefaults中,并在需要时取回。看看this线程和this之一。

+0

@Downvoter,请注意解释投票理由,我不会给你一个类似的沉默投票:) – NeverHopeless 2014-10-09 09:46:49

0

不应该使用NSUSerdefault来保留自定义对象的集合。 您应该使用NSkeyedUnarchiver/NSkeyedarchiver保存它们。 Ref:NSCoding。

1

运行期间UserId可能是NSNumber型的,即使你代码键入NSString

检查如何创建UserId。使用调试器来检查运行时类型。

新发布的代码显示您检索users数组中可能包含字典的UserId。在这些字典中,键值为UserID。它取决于如何创建字典数组(json反序列化?),但看起来UserID键引用的​​对象类型是数字类型,而不是字符串。因此,所有你需要做的是转换这个数为一个字符串:

UserID = [[[users objectAtIndex:indexPath.row] valueForKey:@"UserID"] stringValue]; 

现在你的关键始终是一个字符串。

+0

是的用户ID是1,所以它需要它是nsnumber,但将其作为nsstring – Manthan 2014-10-09 10:15:40

+0

@Manthan该键不能是'NSNumber',它必须是'NSString'。再次检查密钥是如何创建的,并在必要时将其转换为字符串。 – 2014-10-09 10:17:38

+0

好吧,我会尽力让你知道。 – Manthan 2014-10-09 10:23:53

相关问题