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