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"];
}
在我的应用程序中,我要求用户绘制符号,然后我使用以下代码在 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"];
}