Objective c 从自我内部摧毁自我

Objective c 从自我内部摧毁自我,objective-c,objective-c-runtime,oneway,Objective C,Objective C Runtime,Oneway,我有一个Objective-C类,它的实例可以在不再需要它们时进行检测并销毁它们自己,但我正在寻找一种安全的方法,从对象本身内部触发对象的自我销毁,而不会以某种方式“销毁调用销毁的方法”。。。我的代码大致如下(为了简洁起见删除了一些代码): 如果我调用-release,它应该立即返回到主线程(由于单向) 同时,如果实例发现不再需要它,那么它应该调用one-way类方法destroyInstance:,并将自身从运行时中删除。我的问题是,这安全吗??我是否正确使用了单向?在我看来,有可能在实例返回

我有一个Objective-C类,它的实例可以在不再需要它们时进行检测并销毁它们自己,但我正在寻找一种安全的方法,从对象本身内部触发对象的自我销毁,而不会以某种方式“销毁调用销毁的方法”。。。我的代码大致如下(为了简洁起见删除了一些代码):

如果我调用
-release
,它应该立即返回到主线程(由于
单向

同时,如果实例发现不再需要它,那么它应该调用
one-way
类方法
destroyInstance:
,并将自身从运行时中删除。我的问题是,这安全吗??我是否正确使用了单向
?在我看来,有可能在实例返回之前销毁它的
-release
函数,这可能是。。。相当糟糕


(注:显然不希望与NSObject等有任何关系。
:)

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

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

至于代码的其余部分,根本没有理由在
+destroy instance
中将
obj
设置为
nil
,因此,如果您试图完成某些特定的任务(
nil
,可能是指向该对象的指针),那么这种方法是不正确的

考虑到单向
的使用,该语言说的是发送此消息不会阻止调用线程。在释放对象的上下文中,我认为这是有意义的,因为可能消息的目标将不再被该线程引用。按照这种逻辑,我认为您的
+destroycontain
声明可能是正确的。我确实想知道您是否需要提供某种类型的同步,以便不存在
保留
/
释放
竞争条件,但考虑到这一点,获取对象的所有权可能永远不会是异步的


我个人的观点是,任何将此代码投入生产的人都可能会被解雇或起诉=p。但如果只是出于教育目的,请尽情享受,并希望这会有所帮助。

如果你想要在任何环境下都能运行和维护软件,并且不安全,这无疑是一个糟糕的想法。但有时糟糕的、不安全的想法在周末可能会很有趣,所以我会回答我能识别的问题的组成部分

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

至于代码的其余部分,根本没有理由在
+destroy instance
中将
obj
设置为
nil
,因此,如果您试图完成某些特定的任务(
nil
,可能是指向该对象的指针),那么这种方法是不正确的

考虑到单向
的使用,该语言说的是发送此消息不会阻止调用线程。在释放对象的上下文中,我认为这是有意义的,因为可能消息的目标将不再被该线程引用。按照这种逻辑,我认为您的
+destroycontain
声明可能是正确的。我确实想知道您是否需要提供某种类型的同步,以便不存在
保留
/
释放
竞争条件,但考虑到这一点,获取对象的所有权可能永远不会是异步的


我个人的观点是,任何将此代码投入生产的人都可能会被解雇或起诉=p。但是,如果只是出于教育目的,请尽情享受,并希望这会有所帮助。

如果你需要,你的设计会被严重破坏。同意,这听起来是个坏主意。让ARC做这项工作有什么问题?如果你有额外的清洁,你可以把它放在dealloc。我看不到您的问题的用例。如果您在运行时做了一些疯狂的事情,并且没有使用ARC或GC,请使用objc_disposeClassPair,但从另一个对象执行。@Jano ARC不会处理(我想?)任何不从NSObject继承的内容,我正在尝试创建自己的基类,并寻找一种合理的销毁机制——卸载到另一个对象目前看起来相当不错!圆弧处理任何对象或块指针。看到这个你也会感兴趣:@Jano干杯!这正是我需要调查的事情!我也不知道ARC是如此的普遍…如果你需要这个,你的设计已经被严重破坏了。同意,这听起来是个坏主意。让ARC做这项工作有什么问题?如果你有额外的清洁,你可以把它放在dealloc。我看不到您的问题的用例。如果您在运行时做了一些疯狂的事情,并且没有使用ARC或GC,请使用objc_disposeClassPair,但从另一个对象执行。@Jano ARC不会处理(我想?)任何不从NSObject继承的内容,我正在尝试创建自己的基类,并寻找一种合理的销毁机制——卸载到另一个对象目前看起来相当不错!圆弧处理任何对象或块指针。看到这个你也会感兴趣:@Jano干杯!这正是我需要调查的事情!我也不知道ARC是如此的普遍…哈哈,别担心,它肯定只是教育性的-我正在尝试我的手在实现
+ (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
    }
}