让两个对象间建立weak关系

这是为了给两个对象间建立weak关系,当一个对象被释放时,另外一个对象再获取这个值时就是nil,也就是不持有这个对象:)

源码:

WeakRelatedDictionary.h 与 WeakRelatedDictionary.m

  1. //
  2. // WeakRelatedDictionary.h
  3. // TestDemo
  4. //
  5. // Created by YouXianMing on 14-9-25.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @interface WeakRelatedDictionary : NSObject
  12.  
  13. + (void)addObject:(id)object forKey:(id)key;
  14. + (id)objectForKey:(id)key;
  15.  
  16. @end
  1. //
  2. // WeakRelatedDictionary.m
  3. // TestDemo
  4. //
  5. // Created by YouXianMing on 14-9-25.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "WeakRelatedDictionary.h"
  10.  
  11. static NSMapTable *weakDictionary = nil;
  12.  
  13. @implementation WeakRelatedDictionary
  14.  
  15. + (void)initialize
  16. {
  17. if (self == [WeakRelatedDictionary class])
  18. {
  19. // 弱引用object弱引用object
  20. weakDictionary = [NSMapTable weakToWeakObjectsMapTable];
  21. }
  22. }
  23.  
  24. + (void)addObject:(id)object forKey:(id)key
  25. {
  26. if (object == nil || key == nil)
  27. {
  28. NSLog(@"object or key should not be nil.");
  29. return;
  30. }
  31.  
  32. if ([weakDictionary objectForKey:key] == nil)
  33. {
  34. [weakDictionary setObject:object forKey:key];
  35. }
  36. }
  37.  
  38. + (id)objectForKey:(id)key
  39. {
  40. return [weakDictionary objectForKey:key];
  41. }
  42.  
  43. @end

NSObject+WeakRelated.h 与 NSObject+WeakRelated.m

  1. //
  2. // NSObject+WeakRelated.h
  3. // ScrollViewShowImage
  4. //
  5. // Created by YouXianMing on 14-9-24.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @interface NSObject (WeakRelated)
  12.  
  13. // 与对象弱相关联系
  14. - (void)setRelatedObject:(id)object;
  15.  
  16. // 取出建立关系的对象
  17. - (id)relatedObject;
  18.  
  19. @end
  1. //
  2. // NSObject+WeakRelated.m
  3. // ScrollViewShowImage
  4. //
  5. // Created by YouXianMing on 14-9-24.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "NSObject+WeakRelated.h"
  10. #import "WeakRelatedDictionary.h"
  11.  
  12. @implementation NSObject (WeakRelated)
  13.  
  14. - (void)setRelatedObject:(id)object
  15. {
  16. [WeakRelatedDictionary addObject:object forKey:self];
  17. }
  18.  
  19. - (id)relatedObject
  20. {
  21. return [WeakRelatedDictionary objectForKey:self];
  22. }
  23.  
  24. @end

测试代码:

Model.h 与 Model.m

  1. //
  2. // Model.h
  3. // ObjectRelated
  4. //
  5. // Created by YouXianMing on 14-9-27.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @interface Model : NSObject
  12.  
  13. @end
  1. //
  2. // Model.m
  3. // ObjectRelated
  4. //
  5. // Created by YouXianMing on 14-9-27.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "Model.h"
  10.  
  11. @implementation Model
  12.  
  13. @end

ViewController.m

  1. //
  2. // ViewController.m
  3. // ObjectRelated
  4. //
  5. // Created by YouXianMing on 14-9-27.
  6. // Copyright (c) 2014年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import "NSObject+WeakRelated.h"
  11. #import "WeakRelatedDictionary.h"
  12. #import "Model.h"
  13.  
  14. @interface ViewController ()
  15.  
  16. @property (nonatomic, strong) Model *model;
  17.  
  18. @end
  19.  
  20. @implementation ViewController
  21.  
  22. - (void)viewDidLoad {
  23. [super viewDidLoad];
  24.  
  25. _model = [Model new];
  26. self.relatedObject = _model;
  27.  
  28. NSLog(@"%@", self.relatedObject);
  29.  
  30. [self performSelector:@selector(showInfo) withObject:nil afterDelay:];
  31. }
  32.  
  33. - (void)showInfo
  34. {
  35. _model = nil;
  36. NSLog(@"%@", self.relatedObject);
  37. }
  38.  
  39. @end

让两个对象间建立weak关系的更多相关文章

  1. Qt 对象间的父子关系

    C++中只要有一个new就必须要有一个delete与之对应 但是Qt中的对象之间有特殊的关系 Qt 对象间的父子关系 每一个对象都保存有它所有子对象的指针 每一个对象都有一个指向其父对象的指针 par ...

  2. 7.QT-Qt对象间的父子关系

    Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址 ...

  3. 两台linux之间建立信任关系,实现免密码ssh远程登录或scp数据上传

    两台linux之间建立信任关系,实现免密码远程登录或数据上传 1.执行ssh-keygen命令,生成建立安全信任关系的证书: linux1上:执行命令  ssh-keygen  -t rsa 在程序提 ...

  4. 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9030121.html 想直接看结论先提前列出: 1.存储一个对象,文件不是真的给你存储的了对象这种东西, ...

  5. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  6. java中两个对象间的属性值复制,比较,转为map方法实现

    package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...

  7. 在两台服务器之间建立信任关系解决scp,ssh等不用输入密码等问题

    A服务器(client)向B服务(server)SCP,SSH. A服务器:ssh-keygen -t rsa -C "kangzj" 一直回车. cd .ssh vim id_r ...

  8. ssh两台机器建立信任关系无密码登陆

    在建立信任关系之前先看看基于公钥.私钥的加密和认证. 私钥签名过程 消息-->[私钥]-->签名-->[公钥]-->认证 私钥数字签名,公钥验证 Alice生成公钥和私钥,并将 ...

  9. .net两个对象比较,抛出不一样字段的结果

    现在应该经常用到记录操作日志,修改和新增必定涉及到两个实体的属性值的变动. 利用反射,将变动记录下来. 切记,类中的属性字段上面需要打上Description标签: 例如: /// <summa ...

随机推荐

  1. freepbx对接gms网关

    前面的文章阿里云使用镜像安装freepbx , 安装freepbx后创建sip分机 ,freepbx的SIP通话客户端X-lite Yate eyeBeam Linphone我们已经成功的创建好了分机 ...

  2. 从入门到不放弃系列之Koa2

    一.Koa2入门 本来是想Express入门的,但是既然都是要学,干嘛不学最新的呢? 其实我想说,我本来只是想学个小程序开发,现在已经陆陆续续开了好多坑了.. 本文参考廖雪峰教程 二.Async 最新 ...

  3. 使用Xshell和Xftfp部署简单的项目

    最近本人偶尔接触到该如何部署项目,朋友要求截图,趁此之际,简单总结一下,以供大家分享,更希望各位大神指点,大家相互学习,有问题的勿喷. 1.使用环境:win 7+MyEclipse 2014 + to ...

  4. 用java做操作系统内核:软盘读写

    在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的.只不过我们加载的代码,最大只能512 byte, 一个操作系统内核,少说也要 ...

  5. Xamarin学习

    慧都视频:http://training.evget.com/video/5384 极客学院视频:http://www.jikexueyuan.com/course/364.html

  6. 使用C#利用cmd来调用java jar包获取其中的数据

    其实也很简单,就是在C#中构建一个Process,启动jar包,并且给jar包传递参数 因为我并没有怎么学过JAVA,所以只写了个很小的Demo,就是根据传入的参数获取对应的数据 以下是JAVA De ...

  7. Java基础教程(20)--数字和字符串

    一.数字   在用到数字时,大多数情况下我们都会使用基本数据类型.例如: int i = 500; float gpa = 3.65f; byte mask = 0xff;   然而,有时候我们既需要 ...

  8. 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式

    一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...

  9. O(∩_∩)O~~

    1.在一切ac的路上,所以的难题都是纸老虎. 2.加油吧,少年.

  10. 【 js 片段 】移动端适配简易步骤

    手机端全部适配简易步骤,不确保没有bug. 1.HTML 的 head 部分中加入如下代码: <meta name="viewport" content="widt ...