App Crash setObjectForKey:对象不能为零

App Crash setObjectForKey: object cannot be nil

在我的应用程序中,我要求用户绘制符号,然后我使用以下代码在 UIImageView 中显示该图像:

UIGraphicsBeginImageContext(captureView.bounds.size);

[captureView.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
[ivStudentSign setImage:viewImage];
UIGraphicsEndImageContext();

NSMutableDictionary *tempDict=[[NSMutableDictionary alloc] init];
[tempDict setObject:UIImagePNGRepresentation(viewImage) forKey:userID];
[arrStoreSigns addObject:tempDict];
[userDef setObject:arrStoreSigns forKey:@"storeSigns"];

它几乎可以正常工作,但有时我得到

setObjectForKey: object cannot be nil

这使得我的申请 crash.What 我做错了?我 运行 申请 ios 8.4.1

答案就在崩溃日志中。 setObjectForKey 方法需要一个不为 nil 的对象设置为 NSDictionary。检查您是否获得了 UIImagePNGRepresentation(viewImage)arrStoreSigns

所需的值

要弄清楚这一点,您需要倒退。

对象为nil,即arrStoreSigns为nil。 arrStoreSigns 为零,因为 tempDict 为零。 tempDict 是 nil,因为 UIImagePNGRepresentation(viewImage) 没有给你任何价值,因此它变成了 nil。这可能会发生,因为 viewImage 由于 UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 返回 nil 图像而为零。

你打断点看看,上面哪一个断点确实失败了。

在 NSMutableDictionary 中,不能为键设置 nil 值。它可以是 NULL 对象。 为了确保 nil 和 NULL 对象不能插入到字典中,您可以使用以下代码片段来避免崩溃。

if (anObject != [NSNull null] && anObject != nil) {
     [self setObject:anObject forKey:aKey];
}

这里 anObject 可以是你的图像对象,self 可以是你的 tempDict。

您的代码:

UIGraphicsBeginImageContext(captureView.bounds.size);

[captureView.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
[ivStudentSign setImage:viewImage];
UIGraphicsEndImageContext();

NSMutableDictionary *tempDict=[[NSMutableDictionary alloc] init];
if (viewImage != [NSNull null] && viewImage != nil) {
    [tempDict setObject:UIImagePNGRepresentation(viewImage)   forKey:userID];
    [arrStoreSigns addObject:tempDict];
    [userDef setObject:arrStoreSigns forKey:@"storeSigns"];
}