从自我内部摧毁自我

时间:2012-10-14 11:31:35

标签: objective-c objective-c-runtime oneway

我有一个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等有关的事情:)

1 个答案:

答案 0 :(得分:4)

如果您想要在任何环境中使用可维护的软件并且不安全,那么毫无疑问这是一个糟糕的主意。但有时可怕的,不安全的想法在周末会很有趣,所以我会回答我能辨认的问题的组成部分。

由于实例已取消分配,因此方法不会被“销毁”。可能发生的是self在执行方法期间最终会指向释放的内存,这意味着在此期间访问self或任何实例变量可能会崩溃。

至于您的其他代码,根本没有理由将obj设置为nil中的+destroyInstance,所以如果您尝试特别完成某些事情({{ 1}}'或许指出对象的指针)这种方式不是正确的方法。

考虑使用nil,语言说的是发送此消息不会阻止调用线程。在释放对象的上下文中,我认为这是有道理的,因为可能消息的目标不再被该线程引用。根据这个逻辑,我认为你的oneway声明可能没问题。我想知道你是否需要提供某种同步,以便没有+destroyInstance / retain竞争条件,但考虑到它,获取对象的所有权应该永远不会是异步的。

我个人认为,任何将此代码投入生产的人都应该被解雇或起诉= P.但如果它仅用于教育目的,请玩得开心,并希望这会有所帮助。