如何监听某个object被析构了?

2011-12-07 21:33:05 +08:00
 WarWithinMe
有没有办法知道一个object被析构了呢?
比如说在GC下,我希望在某个不是我管理的object的finalize被调用前,调用一下我自己的代码。
或者非GC下,就在dealloc之前调用我自己的代码。

具体应用环境:我利用associative reference把objectB关联到objectA上面,然后希望objectA在被析构的时候,也把objectB释放掉。。

虽然可以用些hacky技巧。但是想知道有没有比较正常的方法。
5056 次点击
所在节点    iDev
7 条回复
lldong
2011-12-07 21:50:14 +08:00
通过method swizzling把dealloc方法替换是一种方法。
WarWithinMe
2011-12-07 21:55:08 +08:00
@lldong 我目前就想到这个方法,有点hack的感觉。看来好像没有比较普通的途径。。。
fly2never
2011-12-17 13:08:57 +08:00
用Notifications或者kvo检测行不行?或许是一个方法
WarWithinMe
2011-12-17 13:23:44 +08:00
@fly2never dealloc或者finalize的时候,应该不会发送notification吧。。。
而对于KVO,则有两个疑问,1.非GC情况下,retainCount应该是不可以被observe的。。2.GC情况下,一个weak引用如果在引用的对象被回收的时候,自动变成nil的话,这个倒可以observe。
elden
2011-12-17 14:24:22 +08:00
把policy设为OBJC_ASSOCIATION_RETAIN(objectB会被objectA retain),然后release objectB,当后面objectA dealloc的时候是会把objectA也release。
elden
2011-12-17 14:25:28 +08:00
上面打错。

把policy设为OBJC_ASSOCIATION_RETAIN(objectB会被objectA retain),然后release objectB,当后面objectA dealloc的时候是会把objectB也release。
WarWithinMe
2011-12-17 14:33:52 +08:00
@elden 原来这样啊。。受教了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/23036

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX