|
|
1
13
objc ou setassociatedobject()和朋友被添加到iPhone OS 3.1中,所以如果你可以选择只瞄准3.1+个设备,实际上你可以像在雪豹身上那样做。 如果你不能,你可以创建一个静态的关联字典和monkey补丁nsobjects-dealloc方法。由于各种技术原因,这个解决方案不能在gc存在的情况下正常工作(这就是苹果添加关联功能的原因),但由于iPhone不支持gc,这是一个没有问题的问题。 如果您刚开始这个项目的工作,我强烈建议您使用运行时函数,目标是3.1 plus,但是如果这不是一个选项,这里有一个例子说明您如何做。 lgassociativestorage.h:联合存储库。
lgassociativestorage.mm(相关存储).
|
|
|
2
3
你可以把它们放在一个单独的地方。 |
|
|
3
2
在一般类别中没有好的方法可以做到这一点。 通过使用全局nsmutabledictionary,可以轻松地为对象添加数据,该dictionary可以从任意nsobject映射到所需的任何数据。问题是无法知道对象何时被释放,因此您无法(通常)知道数据何时过时。 解决这个问题的唯一通用方法是使用Swizing方法替换nsObject DealLoc方法来报告对象的释放位置并释放关联的数据。我肯定有人做过这件事,但这是一个可怕的黑客,很难推荐一个有效的认可。 现在,如果有问题的对象有其他方法来监视生命周期(例如,一些释放挂钩,比如委托对象将关闭某种类型的方法),那么您可以使用它来释放关联的数据,这将使该技术非常直接和合法。 |
|
|
4
0
我再加一个答案。 我找到了原版 blog post 是史蒂夫·德古蒂斯写的。
它基本上包括替换nsObject的方法
就像路易斯的解决方案一样恶心有趣。 |
|
|
5
0
尽管担心并发性问题,为什么不使用全局变量呢?即使使用运行时objc_set/get associatedobject()方法,也不会传递一个“全局”静态变量地址,在这种情况下,仍然存在并发问题,不是吗? |
|
|
user2606782 · 限制子视图在superview边界内的移动 8 年前 |