2014-09-29 120 views
0

我刚搬到iOS 8,安装了Xcode 6等。 此代码在iOS 7和iOS 6上运行良好。它甚至似乎适用于安装了iOS 8的iPhone 4S。但在iPhone 5和5S上它崩溃了。 (8.0.0和8.0.2都一样) 应用程序是否针对SDK 7或8构建并不重要。它在两种情况下都在同一阶段崩溃。添加空阵列时,NSUserDefaults崩溃

h文件包含:

@property (nonatomic, strong) NSMutableArray* filterBrandsExclude; 

从.m文件:

// Following lines just to set the conditions for your understanding: 
    _filterBrandsExclude = [[NSMutableArray alloc] initWithCapacity:0]; // just creates an empty array. 
// As a matter of fact, this array may well be empty and it worked nicely on older iOS versions. 

// this line crashes: 
    [userDefaults setObject:_filterBrandsExclude forKey:@"filterBrandsExclude"]; 

错误消息:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSKeyValueSlowMutableArray getObjects:range:]: value for key filterBrandsExclude of object 0x17004ae00 is nil' 
*** First throw call stack: 
(0x1885c6084 0x198bac0e4 0x1885c5fc4 0x18946097c 0x189460a68 0x189460ab0 0x1884c24d0 0x18854be90 0x1884c21c0 0x1884c17e8 0x188627c80 0x188552d9c 0x188551e9c 0x188600290 0x1885ff840 0x1886030e4 0x1893bb750 0x100053e5c 0x1000522a4 0x18cfd65d4 0x18cfdead0 0x18cfdea58 0x18cfd238c 0x1907d1640 0x18857e360 0x18857d468 0x18857ba8c 0x1884a9664 0x1915eb5a4 0x18cdae984 0x1000515f4 0x19921aa08) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

任何想法是表示赞赏。

回答

0

两件事。

  1. 在你的错误,它说,对于关键filterBrandsInclude值是零,但在你的问题,你引用的关键filterBrandsExclude。你确定你在这一点上确定了实际的错误吗?

编辑:点#2无效。

+0

感谢点1.这是一个复制和过去的错误。我会解决我的问题。 是的,存储NSNull或从偏好中删除该值可能是一种解决方法。 – 2014-09-29 13:07:47

+0

好吧,只是为了让你知道,添加'[NSNull null]'而不是结果'尝试设置一个非属性列表对象null作为关键filterBrandsExclude的NSUserDefaults/CFPreferences值,而当我添加'[ NSNull null]'作为数组的虚拟条目。 – 2014-09-29 13:14:40

+0

'NSNull'不是属性列表对象,用户默认只能存储属性列表对象('NSData','NSString','NSNumber','NSDate','NSArray'或'NSDictionary')。集合(数组/字典)也可以只包含属性列表对象。这是因为用户默认不是使用'NSCoding'编写的(它不是对象序列化)。 – Mecki 2014-09-29 14:49:27

0

您可以手动检查

if(self.filterBrandsExclude != nil && self.filterBrandsExclude.count > 0) 
    [userDefaults setObject:_filterBrandsExclude forKey:@"filterBrandsExclude"]; 
else 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"filterBrandsExclude"]; 
+0

这当然是我会去的解决方法。但它并没有解释问题本身。 – 2014-09-29 14:25:12

+0

原因是nil值不能存储在NSDefaults中 – hariszaman 2014-09-30 10:46:20