PS: 本来打算三月就完成这两篇博客,但是因为换工作比较忙,一直到现在才有时间更新。
背景
OC 中常见的容器都是强引用的,比如NSArray,NSDictary,NSSet等,但是我们偶尔也需要一个弱引用的容器。
目前我了解到的比较成熟并且容易实现的方法有两个:
实现方法
方法1:使用桥接类,weak修饰
假如容器是: NSMutableArray
目标类是: Person1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25// .h文件
// 定义桥接类
@interface PersonBridge :NSObject
/* 在桥接类中声明一个weak修饰的属性 */
@property (weak , nonatomic) Person *weakPerson;
@end
// .m文件
@implementation PersonBridge
@end
// 使用方法,假如需要把person1,和person2添加到数组中,就可以如下操作
PersonBridge *personBridge1 = [[PersonBridge alloc] init];
personBridge.weakPerson = person1;
PersonBridge *personBridge2 = [[PersonBridge alloc] init];
personBridge.weakPerson = person2;
[self.mArray addObject:personBridge1];
[self.mArray addObject:personBridge2];
每个需要加入数组中的Person,都通过PersonBridge加入到数组中,让数组强引用PersonBridge对象,PersonBridge对象弱引用Person对象
这样假如person1销毁时,不会因为有数组引用而无法销毁,销毁后,PersonBridge对象的weakPerson属性被自动置为nil,不会造成野指针问题
方法2:使用系统提供的弱引用容器类型 NSPointerArray
对于这个弱引用的需求,苹果其实早就提供了比较优雅的解决方案
1 | // 创建弱引用数组 |
与NSPointerArray类似的类还有NSMapTable,NSHashTable
其实还有第三种实现方法,就是用NSValue包装,但是有瑕疵,不知道是不是我用的姿势不对
1 | // 需要包装的对象 |