微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以在方法执行期间释放对象吗?

如何解决可以在方法执行期间释放对象吗?

假设我们在主线程上创建了一个var foo: Foo? = Foo() 的实例,并且我们在另一个线程上调用了一些耗时的实例方法 bar Foo,在我们设置了一小段时间之后foonil 在主线程上。 bar 的执行会发生什么,在我的理解中 bar 应该仍然继续执行,因为调用实例方法隐式传递 self 作为第一个参数,所以即使是最后一个显式引用 foo {1}} 坏了,我们在方法中仍然有一个 ref,它应该很好。但后来我发现这个 stackoverflow post 完全打破了我的理解。那么,有人可以确认/否认在其方法执行期间无法释放对象的事实

解决方法

简短的回答是您的信念是正确的,并且您正在查看与 Swift 无关的问题。

您的链接指向非 ARC Objective-C。 Swift 总是使用 ARC,而 ARC 对保留非常保守。考虑以下 Objective-C 调用:

[target runMethod: parameter];

在 ARC 下,这(概念上)转化为:

[target retain];
[parameter retain];
[target runMethod: parameter];
[parameter release];
[target release];

retainrelease 是原子的、线程安全的调用。

Swift 中也存在类似的行为。正因为如此,作为一般规则(在没有 Unsafe 的情况下),一个变量不会在你持有它的时候“消失”。

这是实现细节。更好的思考方式是默认情况下变量和参数是强的,并且在存在强引用的情况下不能销毁对象。这符合您的理解。

但是,在 ARC 之前,您需要自己插入额外的保留和释放来防止这种情况,而不这样做是很常见的。 (在 10.6 之前,大多数 ObjC 是单线程的。)

即使没有线程,也有可能在没有 ARC 的情况下误入歧途。由于调用者通常不会立即保留返回值,如果他们只是暂时需要它们,即使没有多个线程,也有可能获得悬空指针。例如,对于没有内存管理的简单访问器,这可能会崩溃:

NSString *name = [person name];
[person release];
[self doSomethingWithName: name];

这就是为什么你经常看到旧的 ObjC getter 写成这样的形式:

- (NSString*) title {
    return [[title retain] autorelease];
}

这确保返回的值在事件循环结束前仍然存在,即使 self 释放它或 self 被释放。

Swift 通过 ARC 做类似的事情,但顾名思义,这一切都是自动的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。