我有一个Objective-C类,其实例可以检测它们何时不再需要并自行销毁,但我正在寻找一种安全的方法来触发对象本身内部的自毁,而不会以某种方式“破坏调用破坏的方法“......我的代码看起来大致如此(为简洁起见,有些代码被移除):
+ (oneway void)destroyInstance:(id)obj {
printf("Destroying.\n");
if (obj != nil) {
free(obj);
obj = nil;
}
}
- (oneway void)release {
_noLongerRequired = [self determineIfNeeded]; // BOOL retVal
if (_noLongerRequired) {
[self deallocateMemory]; // Free ivars etc (NOT oneway)
[MyClass destroyInstance:self]; // Oneway
}
}
如果我致电-release
,它应立即返回主线程(由于oneway
)。
同时,如果实例发现不再需要它,那么它应该调用oneway
类方法destroyInstance:
并从运行时中删除它自己。我的问题是,这样安全吗?我是否正确使用了oneway
?在我看来,有可能在它返回之前销毁实例的-release
函数,这可能......相当糟糕......?
(PS:显然没有找到与NSObject等有关的事情:)
)
答案 0 :(得分:4)
如果您想要在任何环境中使用可维护的软件并且不安全,那么毫无疑问这是一个糟糕的主意。但有时可怕的,不安全的想法在周末会很有趣,所以我会回答我能辨认的问题的组成部分。
由于实例已取消分配,因此方法不会被“销毁”。可能发生的是self
在执行方法期间最终会指向释放的内存,这意味着在此期间访问self
或任何实例变量可能会崩溃。
至于您的其他代码,根本没有理由将obj
设置为nil
中的+destroyInstance
,所以如果您尝试特别完成某些事情({{ 1}}'或许指出对象的指针)这种方式不是正确的方法。
考虑使用nil
,语言说的是发送此消息不会阻止调用线程。在释放对象的上下文中,我认为这是有道理的,因为可能消息的目标不再被该线程引用。根据这个逻辑,我认为你的oneway
声明可能没问题。我想知道你是否需要提供某种同步,以便没有+destroyInstance
/ retain
竞争条件,但考虑到它,获取对象的所有权应该永远不会是异步的。
我个人认为,任何将此代码投入生产的人都应该被解雇或起诉= P.但如果它仅用于教育目的,请玩得开心,并希望这会有所帮助。