0

我有一个 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 等有关的任何东西:)

4

1 回答 1

4

如果您想要工作和可维护的软件并且在任何情况下都不安全,那么这无疑是一个糟糕的主意。但有时可怕的、不安全的想法在周末会很有趣,所以我会回答我能辨别的问题的组成部分。

一个方法不会被“销毁”,因为一个实例被释放了。可能发生的情况是,self在方法执行期间最终会指向已释放的内存,这意味着self在此期间访问或任何实例变量都可能崩溃。

至于你的代码的其余部分,根本没有理由设置objequal to nilin +destroyInstance,所以如果你正在尝试完成一些特别的事情(nil也许是指向对象的指针),那么这种方式不是正确的方法.

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

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

于 2012-10-14T13:56:17.937 回答