让两个对象间建立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

目录
相关文章
|
6月前
|
存储
创建一个对象用什么运算符?对象实体与对象引用有何不同?
创建一个对象用什么运算符?对象实体与对象引用有何不同?
|
1月前
|
C++
35对象的动态建立和释放
35对象的动态建立和释放
9 1
|
1月前
|
C++
28对象成员的引用
28对象成员的引用
10 0
|
6月前
|
IDE 开发工具
域对象共享数据~
域对象共享数据~
|
10月前
|
编译器 C语言 C++
C++ 之什么是类 & 对象的关系?
C++ 之什么是类 & 对象的关系?
|
11月前
|
存储 编译器 C语言
C++ 基础篇之类 & 对象的关系
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。
|
设计模式 存储 前端开发
层次结构及对象的定义|学习笔记
快速学习层次结构及对象的定义
100 0
类之间的关系共为6种关系
类之间的关系共为6种关系
304 0
|
程序员
构造函数和实例对象和原型之间的关系
构造函数和实例对象和原型之间的关系
构造函数和实例对象和原型之间的关系
构造函数与实例化之间的关系和原型的引入
构造函数与实例化之间的关系和原型的引入