具有无保留ID对象的列表?(Having a list of unretained id objec

2019-10-17 03:56发布

我如何能实现一类/对象,有一堆非保留的参考id的对象?

我想类似的东西是什么UIControl / NSControl有: addTarget:(id)target action:(SEL)action ...; (在我的情况,不过,我不需要UIControlEvents部分)。 我想用这个目标/行动模式(最好远离委托模式走),但我需要确保添加到我的对象目标将不再保留或保留周期可能发生。

我想用我实现自己的数组malloc / free ,以确保目标不会保留将是一个解决方案,但所有这些麻烦闻起来像已经存在的地方实施的解决方案。 在那儿?

Answer 1:

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

无论是那些目前可在iOS上,但核心基金会。 在任OS X或iOS可以使用CFArrayCFDictionary ,传递NULL的回调,使收集完成其包含的对象没有内存管理。 被警告,如果你尝试,如果他们自己的免费电话桥接可可同行使用这些,集合不能兑现您的非固定/非复制的愿望。 你将不得不使用CF功能与他们进行互动(或掀起一个包装类)。

您也可以在包装你的对象NSValue S,使用valueWithNonretainedObject:并把这些成可可集合( NSDictionary / NSarray )。 收集将自己的价值,但价值不会拥有自己的对象。



Answer 2:

您可以创建一个CFArrayRef ,指定不执行引用计数操作(或回调只是0,如果你感觉很懒惰)回调:

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

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


文章来源: Having a list of unretained id objects?