先看一下NSMapTable是如何被使用的。为了对值做弱引用,所以使用NSMapTable。
// key is strong, value is weak because operation instance is retained by SDWebImageManager's runningOperations property
// 键是强引用,值是弱引用,因为operation实例已经被SDWebImageManager的一个属性强引用
// we should use lock to keep thread-safe because these method may not be accessed from main queue
typedef NSMapTable<NSString *, id<SDWebImageOperation>> SDOperationsDictionary;
NSMapTable是NSDictionary的通用版本,和NSDictionary/NSMutableDictionary不同的是,NSMapTable具有以下特性:
- NSDictionary/NSMutableDictionary对键做拷贝,对值强引用。而NSMapTable初始化时可以指定键和值的内存管理方式(例如:
NSPointerFunctionsStrongMemory
/NSPointerFunctionsWeakMemory
)具体含义参考:NSPointerFunctionsOptions - NSMapTable是可变的,没有不可变版本
- NSZMapTable可以持有键和值的弱引用,当键或者值当中任意一个被释放时,整个键值对会被移除
- NSMapTable可以在加入成员时进行copy操作
- NSMapTable可以存储任意的指针,通过指针来进行相等性和散列检查
NOTE:
NSMapTable专注于强引用和弱引用,意味着swift中流行的值类型是不被适用的,因为只能作用于引用类型
网友评论