关于内存缓存,我的理解就是,从网络上下载的图片文件,直到程序被销毁,或者被自己手动销毁前,能够一直存在内存中,而不是被系统自动销毁.
而按照OC的内存管理原则,图片被下载存储在内存中后,我们可以将下载的图片以UIImage的对象形式存储,并且有一个强指针指向它,这样这个Image对象就不会被销毁,只要这个强指针存在,那么这个Image对象就不会被销毁.这里就引出了,我所理解的内存缓存的理解,我的思路是,(注意下面被我刷红的代码)下载的图片数据可以用定义的模型来进行强引用,注意这段( v.image =[UIImage imageWithData:data];)用模型Video中的image指向了这个image,这样下载的图片对象就回一直被引用着,不会被销毁.这样在有些地方需要这张图片时,只要从这个模型中查找就行,在下面的(if (!v.image))这个判断中就是先判断模型中是否有这张图片,如果有就直接调用,如果没有,就调用下载方法,进行下载,并进行缓存.
// 请注意一下刷红的代码,这段代码是IOS9之前的代码,有些方法被废弃了,但是不影响我要表达的内容
这个是模型数据
@interface Video :NSObject
@property(nonatomic, strong) UIImage *image;
//这里还有其它的属性定义,省略;
@end
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.创建cell
static NSString*ID = @"CELL";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 2.设置cell的数据
Video *v = self.videoList[indexPath.row];
// 如果没有图像
if (!v.image) {
cell.imageView.image = [UIImageimageNamed:@"user_default"];
//需要去网络上加载
[self loadUserImage:indexPath];
} else {
cell.imageView.image = v.image;
}
return cell;
}
//内存缓存,再次启动需要重复加载!
- (void)loadUserImage:(NSIndexPath*)indexPath
{
Video *v = self.videoList[indexPath.row];
NSString *urlStr = [NSStringstringWithFormat:@"%@%@",kBaseURL, v.imageURL];
NSURLRequest *request =[NSURLRequestrequestWithURL:[NSURLURLWithString:urlStr]cachePolicy:0timeoutInterval:2.0f];
//发送网络连接
[NSURLConnectionsendAsynchronousRequest:requestqueue:[[NSOperationQueuealloc]init]completionHandler:^(NSURLResponse*response,NSData *data, NSError *connectionError) {
[NSThreadsleepForTimeInterval:1.0f];
// 将data转换成image
v.image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
//要刷新表格,局部刷新即可
[self.tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationNone];
});
}];
}
写在这里,以上也许还有很多我理解不到位的地方,如果你们找到我理解上不对的地方和错误还请指教,共同进步.