封装NSMapTable并简易的使用

封装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

时间: 2024-12-21 01:22:50

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

AVAudioPlayer简易封装

AVAudioPlayer简易封装   [说明] AVAudioPlayer简易封装,仅仅支持播放,暂停,停止,暂停时候带有渐隐效果,自己用,没有参考价值.   [源码] https://github.com/YouXianMing/AVAudioPlayer-   一个定时器的封装类源码(该定时器可以指定运行的次数) // // SpecialTimer.h // Music // // Created by XianMingYou on 15/4/13. // Copyright (c) 2

Java游戏服务器之数据库表存取封装_java

项目涉及的数据库表并不多,但每个select.insert.update和delete都去手动拼接字符串,是很低效的,尤其在时常要修改结构的情况下.开发的一个目标就是自动化,即能自动实现的事情就不要手动去做:还有一个原则是单一化,即尽量保证数据或逻辑一个入口一个出口.这个需求可以使用一些开源库解决,但因为需求简单,目标明确,没有必要引入多余的第三方库.于是自己写了一个,至少满足当前需求. 数据库表的封装,核心类有两个,表(Table)和记录(Record).首先需要一个Table类保存数据库表结

IBM SmartCloud Enterprise管理(一) 使用 ICCT 为 VM 创建软件包

本文提供了 IBM Image Construction and Composition Tool 的概述,并演示如何创建和维护 IBM SmartCloud Enterprise 上的软件包.用一个示例来介绍创建 Google Chrome 软件包的步骤,包括定义 Chrome 软件包元数据,添加安装脚本,以及在 SmartCloud Enterprise 上注册.您应该对云计算基本概念有 一个基本的了解.要尝试本文的步骤,需要一个 IBM SmartCloud Enterprise 用户帐户

JavaScript异步加载浅析_javascript技巧

前言 关于JavaScript脚本加载的问题,相信大家碰到很多.主要在几个点-- 1> 同步脚本和异步脚本带来的文件加载.文件依赖及执行顺序问题 2> 同步脚本和异步脚本带来的性能优化问题 深入理解脚本加载相关的方方面面问题,不仅利于解决实际问题,更加利于对性能优化的把握并执行.   先看随便一个script标签代码-- 复制代码 代码如下: <script src="js/myApp.js"></script> 如果放在<head>上面

ECMAScript6函数默认参数_javascript技巧

语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y || 0; // to do with x, y // return x/y } 简单说就是x,y提供了一个默认值为0,不传时x, y以值0来运算.传了就以实际值计算. 又如定义一个ajax function ajax(url, async, dataType) { async = async !

AFNetworking2.0简易GET,POST请求封装以及使用

AFNetworking2.0简易GET,POST请求封装以及使用 AFNetworking不用我赘述其强大性,本人仅仅做了非常简易的封装,解决了有时候请求出错的问题,提供源码给大家. 封装源码库下载地址: http://pan.baidu.com/s/1wDLIQ 源码: Networking.h 与 Networking.m // // Networking.h // Weather // // Created by YouXianMing on 15/01/01. // Copyright

jQuery版AJAX简易封装代码_jquery

开发过程中,AJAX的应用应该说非常频繁,当然,jQuery的AJAX函数已经非常好用,但是小编还是稍微整理下,方便不同需求下,可以简化输入参数,下面是实例代码: $(function(){ /** * ajax封装 * url 发送请求的地址 * data 发送到服务器的数据,数组存储,如:{"date": new Date().getTime(), "state": 1} * async 默认值: true.默认设置下,所有请求均为异步请求.如果需要发送同步请求

.NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文件系统.总的来说,它们针对的都是"本地"文件,接下来我们通过自定义FileProvider构建一个"远程"文件系统,我们可以将它视为一个只读的"云盘".由于文件系统的目录结构和文件内容都是通过HTTP请求的方式读取的,所以我们将这个自定义的FileP

ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了最终一致性,也就是说当我们发帖或回帖后不会立马显示你的帖子或回复.当我们下一次刷新页面时,会显示出来.这点貌似很多人向我反馈不太习惯,接受不了,呵呵.我之所以这样做也是想看看最终一致性大家的接受程度如何,看来UI层面上的最终一致性,大部分人接受不了.回头我改进下效果,改为立即可以看到帖子或回复吧!另