有一个未保留的id对象列表?

时间:2012-08-13 05:43:47

标签: cocoa-touch cocoa memory-management collections

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

我想要类似于UIControl / NSControl的内容:addTarget:(id)target action:(SEL)action ...;(在我的情况下,我不需要UIControlEvents部分)。我想使用这个目标/动作模式(并且最好远离委托模式),但为此我需要确保添加到我的对象的目标不被保留或保留循环可能发生。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

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

CFArrayRef arr = CFArrayCreate(allocator, values, numValues, callBacks);