在 objective c 中设置 UIImageView 时出现致命错误

Fatal error when setting UIImageView in objective c

你好,我有一个 UIImageview 并试图设置以前保存在 NSArray 中的图像,然后将 NSArray 保存到 NSMutableDictionary 中。这是错误和代码。任何帮助表示赞赏。

*** 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[__NSCFConstantString _isSymbolImage]:无法识别的选择器发送到实例 0x100e14318' 以 NSException

类型的未捕获异常终止
    myAppDelegate *appDelegate = (myAppDelegate *)[UIApplication sharedApplication].delegate;
                       NSMutableArray *allKeys = [[appDelegate.localDataForIngestAndErrorVideos allKeys] mutableCopy];
                     
                       for (NSString *key in allKeys) {
                          NSArray *object = (NSArray*)[appDelegate.localDataForIngestAndErrorVideos  objectForKey:key];
                           NSLog(@"id object ingest: %@",[object objectAtIndex:0]);
                           if ( [cell.Model.ContentItem.videoUploadStatus isEqualToString:@"ingest"])
                           {
                          
                               cell.Model.ContentItem.mediaVideoUriHls = (NSURL*)[object objectAtIndex:2];
                               UIImage *tempImage = [[UIImage alloc]init];
                               tempImage = [object objectAtIndex:1];
                               [cell.mediaImageView setImage:tempImage];  <=== here crashes
                           }
}

错误 [__NSCFConstantString _isSymbolImage]: unrecognized selector sent to instance 是这样说的: 我们先翻译一下:__NSCFConstantStringNSString的内层(优化)class,所以就当成NSString 所以你有 NSString 实例,你尝试在它上面调用 _isSymbolImage 方法。该方法是隐藏的,它是来自 iOS SDK 的后台调用。 但是 NSString 上不存在该方法,它不知道它,因此出现错误。

看到崩溃线:

[cell.mediaImageView setImage:tempImage];

调用的内部方法是有意义的,您正在将 tempImage 视为 UIImage

所以 [object objectAtIndex:1]NSString 而不是 UIImage

现在,我建议为您的 NSDictionary appDelegate.localDataForIngestAndErrorVideos 使用自定义模型。这比处理 NSArray/NSDictionary 每次都不知道里面有什么要好。 您还可以向其添加 methods/compute 属性,例如 -(NSURL)ingestURL 等,以使您的代码更简单易读。

旁注:

UIImage *tempImage = [[UIImage alloc]init];
tempImage = [object objectAtIndex:1];

alloc/init没用,因为你在设置值。您正在无意义地执行 alloc/init,因为您在之后忽略了它。