让两个对象间建立weak关系

让两个对象间建立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:3];
}

- (void)showInfo
{
    _model = nil;
    NSLog(@"%@", self.relatedObject);
}

@end
时间: 2016-04-18
Tags: ios, weak关联

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

C++中建立对象间消息连接的一种系统方法

用过C++进行过面向对象程序设计的用户都知道,程序中的对象很少单独存在.不考虑对象间的相互作用几乎是不可能的.所以,标识对象间的关系或建立对象间的消息连接是面向对象程序设计的一项重要任务.本文着重从C++程序设计的角度,提出一种建立对象间消息连接的实用方法.如果你想详细了解面向对象程序设计技术,请参阅有关专著.大家都知道对象是数据和方法的封装体.在C++中,它们分别表现为数据成员和成员函数.程序设计者通过执行对象的各种方法,来改变对象的状态(即改变对象的属性数据).从而使该对象发生某些"事件&q

Javascript和Java语言有什么关系?两种语言间的异同比较_java

虽然Javascript与Java有紧密的联系,但却是两个公司开发的不同的两个产品.Java是Sun公司推出的新一代面向对象的程序设计语言.特别适合于Internet应用程序开发:而Javascript是Sun与Netscape公司联合推出的产品,是为了扩展Netscape Navigator功能而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言.且它的前身是Live Script,而Java的前身是Oak语言.下面就对两种语言间的异同作如下比较: (1)基于对象和面向对象 Jav

使用Publish/Subscribe 设计模式达到对象间数据同步

对象|设计|数据|数据同步 使用Publish/Subscribe 设计模式达到对象间数据同步 应用程序经常需要更改和交换数据,必须传送这些更改后数据以达到对象的同步,尤其在多窗口用户界面应用程序中更要求这种数据的同步协调,在这一类应用程序中,潜在的数据更新信息一定要反映到所有被包含的子窗体中. 例如一个人员信息管理的应用程序.一次可以打开多个包含一个人名字的窗口,如果你在其中一个窗口中修改并报存了这个人的名字,你将期望对名字改变应立即显示在其它全部窗体内.可以通过使用Publish/Subsc

javaweb-求助啊,怎么实现一个frameset中两个jsp间的数据传输呢?

问题描述 求助啊,怎么实现一个frameset中两个jsp间的数据传输呢? 其中一个jsp提交form表单,另外一个jsp获取到提交过来的数据 解决方案 表单提交到另外一个jsp页面用request对象获取不就行了?和frameset有什么关系? 如果不想提交,另外一个frame获取某个frame里面输入的数据,使用parent.getElementById('frameID').contentWindow.documemt.getElementById获取frame中的控件 解决方案二: ??

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)

谈谈你对面向对象的理解 面向对象编程,即OOP,是一种编程范式,满足面向对象编程的语言,一般会提供类.封装.继承等语法和概念来辅助我们进行面向对象编程. 面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面 面向对象的三大特征 继承,封装,多态 一 继承 继承概念:一个类继承另一个类,则称继承的类为子类,被继承的类为父类. 目的:实现代码的复用. 理解:子类与父类的关系并不是日常生活中的父子

建立生态关系,意味着双赢,而不是零和博弈

应在生态性上寻求统一性的基础.按照生态合作的原则,开发者形成联盟,首先要促成开发者与利益相关者的战略级合作.其它都是一些常规的.细枝末节的事情. 在应用为王的移动互联网,开发者扮演着极为重要的角色,他们是App的主力军.然而,开发者又是整个产业链中的弱势群体.据有关人士介绍,当前手机应用开发者已达到100万,但其中只有13.7%真正盈利.在众多开发者中,挣到一万以内开发费的每年占34.7%,一万到五万只有15.3%左右.开发者要自强,就需要有自己的联盟. 开发者是移动互联网商业生态中的重要一环.

建设-服务器间建立VPN连接。

问题描述 服务器间建立VPN连接. 公司要求用两台 Linux 服务器来将两地的办公网络桥接起来. 通过专线连接到一起! A地的Linux VPN Server 与 B地的 Linux VPN Server 连接. 两地所有服务器和办公电脑都是 公网静态IP地址 A地的大部分主机都是公司的服务器. linux 下,服务器间的VPN连接可以用哪些包来实现? 实习小弟请教大神,我应该用什么软件包来实现它? pptpd 可以吗? pptpd 可以做这个网络方案吗? 解决方案 最常用的是openvpnh

在VS中通过建立依赖关系使文件结构更清晰

在一个Web应用中,当你添加一个Web页面的时候,VS实际上会为你创建三个文件:Xxx.aspx, Xxx.aspx.cs和Xxx.aspx.designer.cs,后面两个文件(依赖文件)依赖于第一个文件(主文件).依赖文件嵌套在主文件下,在结构上看起来非常的清晰.那么你是否可以把存在于同一个目录下的两个相关的文件也建立这种依赖关系呢? 目录 一.文件依赖达到的效果 二.文件依赖关系定义在Project文件中 三.通过VS插件建立两个文件之间的依赖关系   一.文件依赖达到的效果 对于项目文件

《编写高质量代码:改善Objective-C程序的61个建议》——建议6:尽量使用模块方式与多类建立复合关系

建议6:尽量使用模块方式与多类建立复合关系 在2013年的苹果年度大会上,苹果在Objective-C的性能改进上大的变化之一就是加入了模块(Modules). 文件编译问题的存在性-编译时间过长 在了解模块(Modules)之前,需要先了解一下Objective-C的#impor机制.通过使用#import,用来引用其他的头文件. 熟悉C或者C++的人可能会知道,在C和C++里是没有#import的,只有#include(虽然GCC现在为C和C++做了特殊处理,使#imoprt可以被编译),用