gpt4 book ai didi

objective-c - 保留实例化对象的类级数组,而不必显式删除它们

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:09 25 4
gpt4 key购买 nike

我有一个类,比方说 Chicken,我想要一个类级别的方法来枚举所有当前存在的 Chicken。为此,我保留了一个类级别的 NSMutableArray 并在 init 方法中向其添加了 self

这太棒了,我的枚举方法只是返回一个指向这个数组的(不可变的)指针。

问题是我不能再通过删除所有指向它的指针来释放一只鸡,因为数组中总是有一个强指针。

例如如果我这样做...

Chicken *chick = [[Chicken alloc] init];
// Do something with the chick
chick = nil;

因为数组中有一个指向它的强指针,所以鸡还活着。我可以使用 -[Chicken kill] 方法将它从数组中删除,但这并不简洁。

最巧妙的解决方法是什么?

最佳答案

您可以使用 [NSHashTable weakObjectsHashTable]来存储对象。它基本上是一个包含弱引用的数组。它安全、干净。

如果 NSHashTable 不可用或不合适(你想像 NSDictionary 那样保存键值对)但是你有 ARC 和 __weak支持,您可以使用包装器对象来保存弱引用。

我在这个例子中使用 block 来保存弱引用

NSMutableDictionary *globalDict = [NSMutableDictionary dictionary];

// put object
id obj = [Foo new];
__weak id weakRef = obj;
globalDict[key] = [^() { return weakRef; } copy];

// read object
id (^block)(void) = globalDict[key];
id obj = block ? block() : nil;
if (!obj) {
[globalDict removeObjectForKey:key];
}

关于objective-c - 保留实例化对象的类级数组,而不必显式删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22001737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com