zoukankan      html  css  js  c++  java
  • NSCache

    简介:

      它是缓存类,用法和NSMutableDictionary的用法相似,在AFNetworking和SDWebImage中,使用它来缓存。

      NSCache 在系统内存很低时候,会自动释放一些对象。----这句话是出自苹果官方文档,不过在模拟器中模拟内存警告时,缓存不会做清理动作,所以为了确保内存警告时候能够真正的释放内存,最好调用removeAllObjects方法。

      NSCache是安全的线程,在多线程中不需要对Cache加锁。

      NSCache的key知识做强引用,不需要实现NSCopying协议你。

    属性:

      name

      delegate

      totalCostLimit  缓存空间的最大总成本,超出上限会自动回收对象。

              默认值 0 ,表示没有限制。

      countLimit      能够缓存对象的最大数量。

                默认值是 0 ,表示没有限制。

      evictsObjectsWithDiscatdedContent 标示缓存是否能回收废弃的内容。

                        默认值时 YES,表示自动回收。

    方法:

      -objectForKey:返回与键值关联的对象。

      -setObject:forKey: 在缓存中设置指定键名对应的值。

                与可变自动不同,缓存对象不会对键名做copy操作

                0成本

      -setObject:forKey:cost: 在缓存中设置指定键名对应的值,并且制定该键值对的成本。

                   成本(cost)用于计算纪录在缓冲中的所有对象的总成本。

                  当出现内存警告时,或者超出缓存的总成本上限时,缓存会开启一个回收过程,删除部分元素。

      -removeObjectForKey: 删除缓存中,指定键名对象。

      -removeAllObjects 删除缓存中所有对象。

    委托方法:

      -cache:willEvictObject: 缓存将要删除对象时候调用 

                  不能在此方法中修改缓存。 

    demo:

    //

    //  ViewController.m

    //  09-NSCache演练

    //

    //  Created by jerry on 15/9/16.

    //  Copyright (c) 2015年 jerry. All rights reserved.

    //

    /**

     *  代理三部曲,1.继承代理方法  <NSCacheDelegate> 2.设置代理 _myCache.delegate = self 3.实现方法。

     *

     */

    #import "ViewController.h"

    @interface ViewController ()<NSCacheDelegate>

    @property(nonatomic,strong)NSCache *myCache;

    @end

    @implementation ViewController

    -(NSCache *)myCache

    {

        if (_myCache == nil) {

            _myCache = [[NSCache alloc]init];

    //          NSUInteger totalCostLimit 成本限制。 默认 0 也就是不限制。

    //          NSUInteger countLimit 数量限制,默认是 0  也就是不限制。

    //        设置缓存对象,同时制定成本。

    //        - (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

            

            _myCache.countLimit = 30; // 限制数量。而且存的是最新的东西。

            

    //        代理

            _myCache.delegate = self;

            

        }

        return _myCache;

    }

    /**

     *  这个方法主要用于程序员对程序的测试。

     *

     *  @param cache <#cache description#>

     *  @param obj   要删除的对象。在这里通知下代理方法。

     */

    -(void)cache:(NSCache *)cache willEvictObject:(id)obj

    {

        NSLog(@"%@",obj);

    }

     -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    {

        for (int i = 0 ; i<100; i++) {

    //        向缓存中添加对象

            NSString *str = [NSString stringWithFormat:@"hello - %d",i];

            [self.myCache setObject:str forKey:@(i)];

        }

        

        for (int i = 0; i<100; i++) {

            NSLog(@"%@",[self.myCache objectForKey:@(i)]);

        }

    }

    @end

      

  • 相关阅读:
    Android中GC_EXTERNAL_ALLOC的含义
    Phonegap开发的前后台数据交互
    代码管理工具TortoiseSVN
    14款响应式前端开发框架
    简化工作流程,10款必备的HTML5开发工具
    [C#.net]处理UTF-8文件乱码
    [Oracle]ORA-14400:插入的分区关键字未映射到任何分区
    [网络]10M、100M、1000M网线的水晶头接法
    [Office]Execl取消保护密码
    SLI的相关学习
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/4813741.html
Copyright © 2011-2022 走看看