博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计一个不强引用对象的单例字典
阅读量:6923 次
发布时间:2019-06-27

本文共 2389 字,大约阅读时间需要 7 分钟。

设计一个不强引用对象的单例字典

大家都知道,使用NSDictionary存储对象的时候会强引用对象,导致被存储对象的引用计数+1,有时候,我们想用单例来存储对象,但又不希望强引用存储的对象,这该怎么实现呢?

在这里,我们可以使用NSMapTable来实现这个功能.

我直接给出源码:

WeakDictionary.h   +   WeakDictionary.m

////  WeakDictionary.h//  弱引用字典////  http://www.cnblogs.com/YouXianMing///  Copyright (c) 2014年 Y.X. All rights reserved.//#import 
#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 & 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

测试代码:

////  AppDelegate.m//  WeakDic////  Copyright (c) 2014年 Y.X. All rights reserved.//#import "AppDelegate.h"#import "WeakDictionary.h"#import "YXGCD.h"#import "Model.h"@interface AppDelegate ()@property (nonatomic, strong) Model    *model;@property (nonatomic, strong) GCDTimer *timer;@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    // 创建临时model    Model *tmp = [Model new];        // 注册弱引用对象    REGISTER_WEAK_OBJECT(tmp, @"Model");        // 通过属性持有这个临时model    self.model = tmp;        // 7s之后这个属性持有另外一个model(原先model被释放了)    [[GCDQueue mainQueue] execute:^{        self.model = [Model new];    } afterDelay:NSEC_PER_SEC*7];        // 启动定时器监测临时model    _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];    [_timer event:^{        NSLog(@"%@", GET_WEAK_OBJECT(@"Model"));    } timeInterval:NSEC_PER_SEC];    [_timer start];        return YES;}@end

测试图例:

至于为何要设计出这么一种单例出来,这种不增加对象引用计数却能持有对象的单例,你想想能有什么用处呢:)

 

你可能感兴趣的文章
Linux系统学习之路---脚本体会
查看>>
嫌隙太深无法释怀
查看>>
Start with...Connect By
查看>>
PowerDesigner常用操作
查看>>
好文转载—程序员在工作中会追求什么?
查看>>
Sharding-Jdbc之读写分离导读
查看>>
禁用树莓派Raspberry Pi休眠 ,更换树莓派软件源, 如何更换树莓派软件源
查看>>
User switch with custom restrictions in Symfony
查看>>
Backtrack5安装
查看>>
Gradle 接受用户输入
查看>>
bitmap sort(适用于不重复的整数间的排序)
查看>>
ES6 javascript 实用开发技巧
查看>>
Linux insides笔记(二)
查看>>
MySQL查询结果条数编号示例
查看>>
Android拓展系列(2)--Git使用
查看>>
23种设计模式(7):命令模式
查看>>
32位版本windows 2003 AD升级08R2SP1及迁移证书服务图解
查看>>
linux 统计最大文件
查看>>
UML中的类图
查看>>
记录安装oracle的那些事(二)之双系统安装
查看>>