下面是一个零化弱引用包装器类的代码.它可以与NSArray、NSSet和NSDictionary一起正常工作.
这个解决方案的优点是,它与较旧的操作系统兼容,而且非常简单.缺点是迭代时,在使用-nonretainedObjectValue
之前,可能需要验证-nonretainedObjectValue
是否为非nil.
这与CoCoanatics答案的第一部分中的包装器的 idea 相同,它使用块来完成相同的事情.
WeakReference.h
@interface WeakReference : NSObject {
__weak id nonretainedObjectValue;
__unsafe_unretained id originalObjectValue;
}
+ (WeakReference *) weakReferenceWithObject:(id) object;
- (id) nonretainedObjectValue;
- (void *) originalObjectValue;
@end
WeakReference.m
@implementation WeakReference
- (id) initWithObject:(id) object {
if (self = [super init]) {
nonretainedObjectValue = originalObjectValue = object;
}
return self;
}
+ (WeakReference *) weakReferenceWithObject:(id) object {
return [[self alloc] initWithObject:object];
}
- (id) nonretainedObjectValue { return nonretainedObjectValue; }
- (void *) originalObjectValue { return (__bridge void *) originalObjectValue; }
// To work appropriately with NSSet
- (BOOL) isEqual:(WeakReference *) object {
if (![object isKindOfClass:[WeakReference class]]) return NO;
return object.originalObjectValue == self.originalObjectValue;
}
@end