1

如何实现一个引用了一堆非保留对象的类/id对象?

我想要类似于UIControl/ NSControlhas 的东西:(addTarget:(id)target action:(SEL)action ...;但在我的情况下,我不需要该UIControlEvents部分)。我想使用这个目标/动作模式(最好远离委托模式),但为此我需要确保添加到我的对象的目标不会被保留,否则可能会发生保留周期。

我认为使用malloc/实现我自己的数组free以确保不保留目标将是一种解决方案,但是所有这些麻烦闻起来就像已经在某处实现了解决方案。有没有?

4

2 回答 2

4

在 OS X 上,您可以创建一个使用, 或(如果您想要一个字典)NSPointerArray来保持对其对象的弱引用,它允许键和值中的一个或两个被弱保存。+[NSPointerArray weakObjectsPointerArray]NSMapTable

目前 iOS 上都没有这些功能,但 Core Foundation 是可用的。在 OS X 或 iOS 上,您可以使用CFArrayorCFDictionary传递NULL回调以使集合不对其包含的对象进行内存管理。请注意,如果您尝试使用它们,就好像它们是免费的桥接可可对应物一样,该集合将不会满足您不保留/不复制的愿望。您必须使用 CF 函数与它们进行交互(或创建一个包装类)。

您还可以将对象包装在NSValues 中,使用valueWithNonretainedObject:并将它们放入 Cocoa 集合 ( NSDictionary/ NSarray)。集合将拥有该值,但该值将不拥有其对象。

于 2012-08-13T05:56:20.617 回答
1

您可以创建一个CFArrayRef,指定不执行引用计数操作的回调(或者如果您感觉非常懒惰,则只为回调 0 ):

CFAllocatorRef allocator = 0;
const void **values = ...;
CFIndex numValues = ...;
const CFArrayCallBacks* const callBacks = 0;

CFArrayRef arr = CFArrayCreate(allocator, values, numValues, callBacks);
于 2012-08-13T05:56:29.940 回答