Ios 单例类保持';失去';UIImage

Ios 单例类保持';失去';UIImage,ios,objective-c,singleton,Ios,Objective C,Singleton,我有一个Singleton类,我正试图使用它来存储从internet下载的图像,这样我就可以随时访问它。工作流程是我登录Facebook,它将图像下载到Singleton类。一切都很好,图像显示也很好。然而,如果我退出运行该应用程序,图片将不再存在。有人能看看我的代码,看看我是否遗漏了一些东西,让它始终保持图像吗?就像我之前说的,第一次,它工作得很好,但是如果我退出应用程序,UIImage就不再存在了 FBSingleton.h @interface FBSingleton : NSObject

我有一个Singleton类,我正试图使用它来存储从internet下载的图像,这样我就可以随时访问它。工作流程是我登录Facebook,它将图像下载到Singleton类。一切都很好,图像显示也很好。然而,如果我退出运行该应用程序,图片将不再存在。有人能看看我的代码,看看我是否遗漏了一些东西,让它始终保持图像吗?就像我之前说的,第一次,它工作得很好,但是如果我退出应用程序,
UIImage
就不再存在了

FBSingleton.h

@interface FBSingleton : NSObject

@property (nonatomic, strong) UIImage *userImage;

+ (instancetype)sharedInstance;
@end
FBSingleton.m

@implementation FBSingleton

FBSingleton *sharedInstance = nil;

// Get the shared instance and create it if necessary.

+ (FBSingleton *)sharedInstance {
    @synchronized(self){
        if (sharedInstance == nil) {
            sharedInstance = [[super allocWithZone:NULL] init];
        }
    }
    return sharedInstance;
}

- (id)init
{
    self = [super init];

    if (self) {
        // Work your initialising magic here as you normally would

        self.userImage = [[UIImage alloc] init];
    }

    return self;
}

@end
ViewController(负责保存图像)


看起来您希望将映像保存到磁盘,但我没有看到任何将其保存到磁盘或从磁盘加载的代码。您需要将映像写入一个文件,以便在应用程序运行之间保持它;
strong
属性中保存的图像仅在分配内存时保存。当应用程序退出时,内存被释放

很难说这是否确实是问题所在,但根据您对问题的描述,这很可能是您看到的“错误”的原因。尝试使用以下选项之一:

[UIImagePNGRepresentation(image) writeToFile:cachedNameAbsolutePath atomically:YES];
[UIImageJPEGRepresentation(image, 1.0) writeToFile:cachedNameAbsolutePath atomically:YES];

然后,当应用程序启动时,检查是否存在
cachedNameAbsolutePath
并加载图像。如果它不存在,你会联系Facebook再次下载该图像。

看起来你希望将图像保存到磁盘,但我没有看到任何将其保存到磁盘或从磁盘加载的代码。您需要将映像写入一个文件,以便在应用程序运行之间保持它;
strong
属性中保存的图像仅在分配内存时保存。当应用程序退出时,内存被释放

很难说这是否确实是问题所在,但根据您对问题的描述,这很可能是您看到的“错误”的原因。尝试使用以下选项之一:

[UIImagePNGRepresentation(image) writeToFile:cachedNameAbsolutePath atomically:YES];
[UIImageJPEGRepresentation(image, 1.0) writeToFile:cachedNameAbsolutePath atomically:YES];

然后,当应用程序启动时,检查是否存在
cachedNameAbsolutePath
并加载图像。如果它不存在,你会联系Facebook再次下载该图像。

你的意思是,在重新加载应用程序后,UIImageView是空的吗?或者UIImage是空的?您是否已将保存/加载功能设置为磁盘/缓存,还是只想将其设置为在线?仅供参考,更好的方法是使用
dispatch\u once
您的意思是,在重新加载应用程序后,UIImageView为空?或者UIImage是空的?您是否已将保存/加载功能设置为磁盘/缓存,还是只想将其设置为联机?仅供参考,执行单机版的更好方法是使用
dispatch\u once
我是否需要将其中一个方法放置在单机版类中,或者在下载时将其放置在ViewController类中?我试着把它放在那里,但是cachedNameAbsolutePath给出了一个错误;在您的情况下,这将是ViewController。您需要计算自己的
cachedNameAbsolutePath
值作为图像文件的目标文件名。类似于“myCachedImage.png”,但作为一个绝对路径。我需要将其中一个方法放在Singleton类中,还是在下载它时放在ViewController类中?我试着把它放在那里,但是cachedNameAbsolutePath给出了一个错误;在您的情况下,这将是ViewController。您需要计算自己的
cachedNameAbsolutePath
值作为图像文件的目标文件名。类似于“myCachedImage.png”,但作为绝对路径。