为什么这段代码可能会给我null?

时间:2012-03-03 11:59:50

标签: iphone objective-c uiimage

向下滚动到编辑1.此顶部位现在无关紧要。

这是我的代码:

NSMutableDictionary *dictionary = [self.media objectAtIndex:index];
    NSLog(@"dictionary: %@", dictionary);
    NSString *originalImagePath = [dictionary objectForKey:@"OriginalImage"];
    NSLog(@"path: %@", originalImagePath);
    UIImage *originalImage = [UIImage imageWithContentsOfFile:originalImagePath];
    NSLog(@"original image: %@", originalImage);
    return originalImage;

我的NSLog:

dictionary: {
    IsInPhotoLibrary = 1;
    MediaType = 0;
    OriginalImage = "/var/mobile/Applications/5E25F369-9E05-4345-A0A2-381EDB3321B8/Documents/Images/E9904811-B463-4374-BD95-4AD472DC71A6.jpg";
}
path: /var/mobile/Applications/5E25F369-9E05-4345-A0A2-381EDB3321B8/Documents/Images/E9904811-B463-4374-BD95-4AD472DC71A6.jpg
original image: (null)

为什么这可能会出现为空的任何想法,尽管一切似乎都已到位?

编辑:

这是将图像写入文件的代码:

+(NSString *)writeImageToFile:(UIImage *)image {
    NSData *fullImageData = UIImageJPEGRepresentation(image, 1.0f);

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Images/"];
NSString *name = [NSString stringWithFormat:@"%@.jpg", [JEntry generateUuidString]];
NSString *filePath = [path stringByAppendingPathComponent:name];
[fullImageData writeToFile:filePath atomically:YES];
NSLog(@"original image 2: %@", [UIImage imageWithContentsOfFile:filePath]);
}

这个NSLog也是null。所以问题就出在这里,很有可能。有什么想法吗?

编辑2:

所以,现在回溯更多了,我意识到这是因为失败了:

[fullImageData writeToFile:filePath atomically:YES];

你可以在那条线上返回一个bool,告诉它是否成功,并且它为我返回NO。任何想法为什么会这样?

编辑3:

传入的图像为NULL。试着弄清楚现在哪里出了问题。

4 个答案:

答案 0 :(得分:3)

几乎可以肯定,您的文件不存在。如下修改代码以记录文件是否存在:

NSString *originalImagePath = [dictionary objectForKey:@"OriginalImage"];
NSLog(@"path: %@", originalImagePath);
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:originalImagePath];
NSLog(@"file exists: %d", fileExists);

答案 1 :(得分:2)

可能的原因:

  • originalImagePath上的文件不存在。
  • UIImage无法初始化指定文件中的图像,因为数据已损坏(可能数据为空或不完整)
  • 由于iOS文件权限(即访问应用程序沙箱之外的文件时)无法访问该文件

答案 2 :(得分:1)

您是否检查过图像文件是否真的放在字典中的路径上?您可以使用iExplorer实用程序。

同时注意文件名的大小写,所以它的扩展名为'jpg'而不是'JPG'。

最后,你应该通过一些图像浏览器打开它来检查它是否是一个有效的图像文件。

答案 3 :(得分:1)

你确定那个文件夹里有jpg文件“E9904811-B463-4374-BD95-4AD472DC71A6.jpg”吗? 尝试打开安装在iPhone / ipad模拟器中的应用程序文件,单击yourFile.app 用ctrl键并选择打开包内容打开文件夹图像...

获取文档文件夹的快速链接:

NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                               NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSLog(@"doc:%@",docsDir);

您的应用应位于其父文件夹