App Crash setObjectForKey:object不能为nil

时间:2016-01-05 07:05:29

标签: ios objective-c uiimageview uiimage uigraphicscontext

在我的应用程序中,我要求用户绘制标志,然后我使用以下代码在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不能为nil

这使我的应用程序崩溃。我做错了什么?我在ios 8.4.1上运行应用程序

3 个答案:

答案 0 :(得分:2)

要解决这个问题,你需要后退。

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

你放置断点并检查,其中上面的哪一个实际上是失败的。

答案 1 :(得分:0)

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

所需的值

答案 2 :(得分:0)

在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"];
}