如何在弧下获得zeroing weak references的数组?我不希望数组保留对象.我希望数组元素在释放 timeshift 除它们自己,或者将这些条目设置为nil.

同样地,我怎样才能用字典做到这一点?我不想让字典保留这些值.同样,我希望dictionary元素在释放值时删除它们自己,或者将值设置为nil.(我需要保留键,这是唯一的标识符,至少在释放相应的值之前是如此.)

这两个问题涉及相似的理由:

但两人都没有要求zeroing references英镑.

根据文档,NSPointerArray和NSHashMap都不支持ARC下的弱引用.NSValue的nonretainedObjectValue也不起作用,因为它是非归零的.

我看到的唯一解决方案是创建my own个类似于NSValue的包装类,带有(weak)属性,如this answer mentions, near the end.有没有更好的办法让我看不见?

我正在为OS X 10.7和iOS 6.0开发.

推荐答案

下面是一个零化弱引用包装器类的代码.它可以与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

Objective-c相关问答推荐

为何在Objective-C中,使用self.propName赋值会导致崩溃而使用_ivarName则不会?

导航回上一个视图控制器

Objective-C NSMutableArray 在枚举时发生了变异?

如何使用 UIStepper

Objective C中的简单字符串连接

iphone keys 串项目在应用程序卸载后仍然存在?

是否可以将 NSInteger 转换为 NSNumber?

带有 IB_DESIGNABLE 的 UIButton 会引发运行时属性警告,并且不会在 Interface Builder 中呈现

Facebook 添加测试用户和管理员是:(待定),这是什么意思?

NSManagedObjectContext performBlockAndWait:不在后台线程上执行?

如何测试推送通知在我的应用程序中是否有效

如何在 iPhone SDK 中使用自定义字体?

UIFont 的磅值到底是多少?

发出许多网络请求的 iOS 应用程序的最佳架构?

未知类型名称类;您指的是 'Class' 吗?

获取字符串的最后 2 个字符?

检测 iOS 应用程序是否在调试器中运行

UICollectionView 自动调整高度

Objective-c - CABasicAnimation 在动画后应用更改?

如何在 Objective-c 中将数组声明为常量?