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