【发布时间】:2011-09-19 18:48:54
【问题描述】:
我的应用让用户从选择器中选择一张照片。我将所选图像应用于视图,然后将其保存到文件并在用户默认值中引用该文件,以便在创建 UserProfile 时加载头像。
当我关闭应用然后重新启动它时,应用会从文件中加载图像。从文件加载图像后,当我将其应用于图像视图时,我的应用程序崩溃了,因为它被视为 __NSCFArray。 __NSCFArray 上没有方法规模。为什么要转换为此类?
-[__NSCFArray scale]:无法识别的选择器发送到实例 0x145260
* 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'[__NSCFArray scale]: 无法识别的选择器发送到实例 0x145260'
这是我从文件中创建 UIImage 的代码:
@implementation UserProfile
- (id) init {
self = [super init];
if(self) {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
_username = (NSString *)[userDefaults objectForKey:USERNAME_KEY];
NSString *filename = (NSString *) [userDefaults objectForKey:@"AvatarFilename"];
NSLog(@"filename from user defaults: %@",filename);
if (filename) {
_avatar = [UIImage imageWithContentsOfFile:filename];
if (!_avatar) NSLog(@"LOGERROR: avatar was not created from file");
_customAvatar = TRUE;
} else {
_customAvatar = FALSE;
_avatar = [UIImage imageNamed:DEFAULT_AVATAR_FILENAME];
if (!_avatar) NSLog(@"LOGERROR: avatar was not created from default");
}
[self createThumbnail];
}
return self;
}
注意:在我的 createThumbnail 代码中,我将此称为 [_avatar isKindOfClass:[UIImage class],它说它是 UIImage。但是当我设置视图时,它认为它是一个__NSCFArray。我什至不明白这是怎么可能的,因为该属性是 UIImage *。
这就是图像的持久化方式
- (void) setAvatar:(UIImage *)image
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *filename = nil;
if (image) {
if (_avatar) [_avatar release];
_avatar = [image retain];
_customAvatar = TRUE;
filename = [NSString stringWithFormat:@"%@/%@",[MyUtilities applicationDocumentsDirectory],AVATAR_FILENAME];
if (![UIImagePNGRepresentation(image) writeToFile:filename atomically:YES])
NSLog(@"LOGERROR: Failure to write avatar file");
else NSLog(@"saved avatar to PNG file");
} else {
NSLog(@"setting default avatar");
_avatar = [UIImage imageNamed:DEFAULT_AVATAR_FILENAME];
_customAvatar = FALSE;
}
[userDefaults setObject:filename forKey:AVATAR_KEY];
// TODO If performance is crucial, consider creating a default thumbnail as well
[self createThumbnail];
if(![userDefaults synchronize])
{
NSLog(@"LOGERROR: Failure to synchronize userDefaults");
}
}
据我所知,我没有收到内存警告。
【问题讨论】: