让两个对象间建立weak关系

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

源码:

WeakRelatedDictionary.h 与 WeakRelatedDictionary.m

//
// WeakRelatedDictionary.h
// TestDemo
//
// Created by YouXianMing on 14-9-25.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface WeakRelatedDictionary : NSObject + (void)addObject:(id)object forKey:(id)key;
+ (id)objectForKey:(id)key; @end
//
// WeakRelatedDictionary.m
// TestDemo
//
// Created by YouXianMing on 14-9-25.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "WeakRelatedDictionary.h" static NSMapTable *weakDictionary = nil; @implementation WeakRelatedDictionary + (void)initialize
{
if (self == [WeakRelatedDictionary class])
{
// 弱引用object弱引用object
weakDictionary = [NSMapTable weakToWeakObjectsMapTable];
}
} + (void)addObject:(id)object forKey:(id)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:(id)key
{
return [weakDictionary objectForKey:key];
} @end

NSObject+WeakRelated.h 与 NSObject+WeakRelated.m

//
// NSObject+WeakRelated.h
// ScrollViewShowImage
//
// Created by YouXianMing on 14-9-24.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface NSObject (WeakRelated) // 与对象弱相关联系
- (void)setRelatedObject:(id)object; // 取出建立关系的对象
- (id)relatedObject; @end
//
// NSObject+WeakRelated.m
// ScrollViewShowImage
//
// Created by YouXianMing on 14-9-24.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "NSObject+WeakRelated.h"
#import "WeakRelatedDictionary.h" @implementation NSObject (WeakRelated) - (void)setRelatedObject:(id)object
{
[WeakRelatedDictionary addObject:object forKey:self];
} - (id)relatedObject
{
return [WeakRelatedDictionary objectForKey:self];
} @end

测试代码:

Model.h 与 Model.m

//
// Model.h
// ObjectRelated
//
// Created by YouXianMing on 14-9-27.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface Model : NSObject @end
//
// Model.m
// ObjectRelated
//
// Created by YouXianMing on 14-9-27.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "Model.h" @implementation Model @end

ViewController.m

//
// ViewController.m
// ObjectRelated
//
// Created by YouXianMing on 14-9-27.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "ViewController.h"
#import "NSObject+WeakRelated.h"
#import "WeakRelatedDictionary.h"
#import "Model.h" @interface ViewController () @property (nonatomic, strong) Model *model; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; _model = [Model new];
self.relatedObject = _model; NSLog(@"%@", self.relatedObject); [self performSelector:@selector(showInfo) withObject:nil afterDelay:];
} - (void)showInfo
{
_model = nil;
NSLog(@"%@", self.relatedObject);
} @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. android学习-数据存储(一)-----SQLite源码分析

    分析SQLiteDatabase.java,SQLiteStatement.java,SQLiteSession.java,SQLiteConnectionPool.java,SQLiteConnec ...

  2. CentOS6.5安装php7+nginx+mysql实现安装WordPress

    安装php7+nginx参考该博客http://blog.csdn.net/whatday/article/details/50645117 安装php7参考http://blog.csdn.net/ ...

  3. golang基础--map字典

    map 类似python语言中的dict(字典类型),以key-value形式存储数据 Key必须是支持==或!=比较运算的类型,不可以是函数,map或slice map查找比线性搜素快很多,但比使用 ...

  4. SQLite菜鸟教程

    学习链接:http://www.runoob.com/sqlite/sqlite-trigger.html

  5. ant编译apache-nutch-2.2.1结合mysql实现爬虫的安装配置全过程

    之前的数据抓取都是用的八爪鱼软件,老大突发奇想要我自己搞个爬虫来抓取数据,网上找找貌似apache的nutch比较合适,于是就开始安装这啥nutch. 对于一个linux零基础的人来说,还要先学学li ...

  6. Jquery Easy UI初步学习(二)datagrid的使用

    第一篇学的是做一个管理的外框,接着就是数据datagrid绑定了,这里我用asp.net mvc3来做的,主要就是熟悉属性.方法. 打开easyui的demo 就可以看到如下一段代码: 和上篇一样cl ...

  7. 2 duplicate symbols for architecture“文件冲突”

      我在配置第三方库拷贝示例文件中的库文件到新项目完成相关配置之后报下面的错误:   错误的原因是在解决问题之后发现的(第三方库的项目示例demo中的 要拷贝到自己项目中的库  并不需要全部添加到自己 ...

  8. 不要在对抽象类接口abstract virtual什么的混淆不清了

    (最近带一个新手入门 讲这边老费力了.) 接口和抽象类不过都是类的抽象罢了,这是他们的本质,只不过人们的思维角度不同而已,一个偏向为行为契约上的抽象(接口) 一个更像大自然中的繁衍关系(抽象类). 直 ...

  9. Mac下 KGDB连接Linux

    kgdb按照资料说可以使用网络(kgdboe)和串口连接(kgdboc)等方式连接. 这里使用后者,资料比较多,下面是自己在Mac上进行配置连接的过程. 先说一下环境: 主机:Mac OSX 10.1 ...

  10. [HNOI2004]宠物收养场

    fhq treap 开俩哨兵节点,然后插入.删除.前驱.后继,统计即可 #include"cstdio" #include"cstring" #include& ...