封装NSMapTable并简易的使用

NSMapTable是弱引用的字典,可以用来存储对象,该对象消失了也没有关系,对于控制器越级跳转相当有用:)

WeakDictionary.h 与 WeakDictionary.m

//
// WeakDictionary.h
// 弱引用字典
//
// http://www.cnblogs.com/YouXianMing/
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <Foundation/Foundation.h> #define GET_WEAK_OBJECT(key) [WeakDictionary objectForKey:(key)]
#define REGISTER_WEAK_OBJECT(object, key) [WeakDictionary addObject:(object) forKey:(key)] @interface WeakDictionary : NSObject + (void)addObject:(id)object forKey:(NSString *)key;
+ (id)objectForKey:(NSString *)key; @end
//
// WeakDictionary.m
// 弱引用字典
//
// http://www.cnblogs.com/YouXianMing/
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "WeakDictionary.h" static NSMapTable *weakDictionary = nil; @implementation WeakDictionary + (void)initialize
{
if (self == [WeakDictionary class])
{
// 强引用key值弱引用object
weakDictionary = [NSMapTable strongToWeakObjectsMapTable];
}
} + (void)addObject:(id)object forKey:(NSString *)key
{
if (object == nil || key == nil)
{
NSLog(@"object or key should not be nil.");
return;
} if ([weakDictionary objectForKey:key] == nil)
{
[weakDictionary setObject:object forKey:key];
}
} + (id)objectForKey:(NSString *)key
{
return [weakDictionary objectForKey:key];
} @end

提供的两个category

NSObject+WeakDictionary.h 与 NSObject+WeakDictionary.m

//
// NSObject+WeakDictionary.h
// YouXianMing
//
// Created by YouXianMing on 14-9-20.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface NSObject (WeakDictionary) - (void)storeToWeakDictionaryWithKey:(NSString *)key; @end
//
// NSObject+WeakDictionary.m
// YouXianMing
//
// Created by YouXianMing on 14-9-20.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "NSObject+WeakDictionary.h"
#import "WeakDictionary.h" @implementation NSObject (WeakDictionary) - (void)storeToWeakDictionaryWithKey:(NSString *)key
{
[WeakDictionary addObject:self forKey:key];
} @end

NSString+WeakDictionary.h 与 NSString+WeakDictionary.m

//
// NSString+WeakDictionary.h
// YouXianMing
//
// Created by YouXianMing on 14-9-20.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface NSString (WeakDictionary) - (id)recoverFromWeakDictionary; @end
//
// NSString+WeakDictionary.m
// YouXianMing
//
// Created by YouXianMing on 14-9-20.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "NSString+WeakDictionary.h"
#import "WeakDictionary.h" @implementation NSString (WeakDictionary) - (id)recoverFromWeakDictionary
{
return [WeakDictionary objectForKey:self];
} @end

使用示例的话,以上一篇教程为例子来演示: http://www.cnblogs.com/YouXianMing/p/3983530.html

封装NSMapTable并简易的使用的更多相关文章

  1. vue自定义插件封装,实现简易的elementUi的Message和MessageBox

    vue自定义插件封装示例 1.实现message插件封装(类似简易版的elementUi的message) message组件 <template>     <transition  ...

  2. 自己封装的一个简易的二维表类SimpleTable

    在QT中,QTableWidget处理二维表格的功能很强大(QTableView更强大),但有时我们只想让它显示少量数据(文字和图片),这时,使用QTableWidget就有点不方便了(个人感觉).所 ...

  3. AVAudioPlayer简易封装

    AVAudioPlayer简易封装 [说明] AVAudioPlayer简易封装,仅仅支持播放,暂停,停止,暂停时候带有渐隐效果,自己用,没有参考价值. [源码] https://github.com ...

  4. 用java自制简易线程池(不依赖concurrent包)

    很久之前人们为了继续享用并行化带来的好处而不想使用进程,于是创造出了比进程更轻量级的线程.以linux为例,创建一个进程需要申请新的自己的内存空间,从父进程拷贝一些数据,所以开销是比较大的,线程(或称 ...

  5. HBase封装easy-hbase设计实现

    新增码云地址:https://gitee.com/hanmov5/mop-hbase-template 一.写在前面 业务架构用到HBase,但由于某些不可名状原因,没有用phoniex等上层工具,开 ...

  6. ES6函数默认参数(Default Parameters)

    语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y ...

  7. 谈谈异步加载JavaScript

    前言 关于JavaScript脚本加载的问题,相信大家碰到很多.主要在几个点—— 1> 同步脚本和异步脚本带来的文件加载.文件依赖及执行顺序问题 2> 同步脚本和异步脚本带来的性能优化问题 ...

  8. AsyncHttpClient httpURLCon httpClient AsyncTask 访问服务器

    Activity /**  * 测试使用三种方式(AsyncHttpClient.httpURLCon.httpClient)分别以get和post方式访问服务器  * @author 白乾涛  */ ...

  9. .NET中的FileUpload控件的使用-原生JS(二)

    本篇使用原生JS进行数据传输,使用FileUpload控件上传文件,适配IE. HTML <div class="container"> <div class=& ...

随机推荐

  1. Pyltp使用

    1.先使用pip安装pyltp-0.2.1-cp36-cp36m-win_amd64.whl 2.再参考API文档进行具体的使用:http://pyltp.readthedocs.io/zh_CN/d ...

  2. Java 集合框架(二)—— ArrayList

    二.数组列表 —— ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...

  3. ADB故障时的一些命令

    开发中经常用到adb重启等操作,简单记录一下. 1.重启 adb kill-server adb start-server 2.显示版本号 adb version 3.显示已连接的设备 adb dev ...

  4. 搭建jenkins

    使用Jenkins配置Git+Maven的自动化构建 实现背景:Jenkins通过给定的代码地址URL,将代码拉取到其“宿主服务器”(就是Jenkins的安装位置),进行编译.打包和发布到容器中.在J ...

  5. SSL虚拟主机安全方案

    SSL虚拟主机安全方案 随着虚拟主机技术的发展,功能越来越丰富,已经不仅仅只是满足个人网站的需要,越来越多的小型电子商务网站也采用了虚拟主机来建站,如何为这些商户提供经济.方便的SSL解决方案,成为虚 ...

  6. oracle 一对多数据分页查询筛选

    今天项目测试运行的时候,遇到了一个奇怪的问题,这个问题说起来按sql语法的话是没有错误的 但是呢按照我们的业务来做区分就有些逻辑上的错误了, 下面请听我慢慢道来,在数据库中有两个数据, 先来看下第一次 ...

  7. [转] Hadoop MapReduce开发最佳实践(上篇)

    前言 本文是Hadoop最佳实践系列第二篇,上一篇为<Hadoop管理员的十个最佳实践>. MapRuduce开发对于大多数程序员都会觉得略显复杂,运行一个WordCount(Hadoop ...

  8. IE浏览器版本的判断

    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 && userAgent.indexOf(; //判断是否IE< ...

  9. 使用pd从数据库逆向生成pdm文件

    使用pd从数据库逆向生成pdm文件 好久没更新博客了,最近忙着各种事,捞了点老本行java的一些东西,浑浑噩噩,花了几天时间用java搭建了一个小项目的restful接口,深深觉得这东西论效率被nod ...

  10. Python标准模块--concurrent.futures 进程池线程池终极用法

    concurrent.futures 这个模块是异步调用的机制concurrent.futures 提交任务都是用submitfor + submit 多个任务的提交shutdown 是等效于Pool ...