- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
特别是,这种代码是否总是按预期工作(其中 MyResourceGuard 是一个在其 init 方法中锁定独占资源并在其 dealloc 方法中释放锁的对象):
NSLog(@"About to capture some exclusive resource.");
{
MyResourceGuard* guard = [MyResourceGuard new];
// Do something with the exclusive resource here.
}
// guard is out of scope, therefore its dealloc should have
// been called right away and the resource should already
// be free again at this point.
我在书籍和博客中读到的内容与例如Java 垃圾回收,一旦引用计数减少到零(而不是在它自己方便的时候),ARC 就会销毁对象,但我没有在 Apple 的任何官方文档中读到过这一点。如果那是真的,为什么我们需要在 ARC 中引入新的 @autoreleasepool 关键字?
在调试过程中,我总是看到对象被立即解除分配,除非在 try-catch-block 中引发异常,在这种情况下,实际上从未调用 dealloc(这是一个Mac 错误,或者只是这些可怕的 Objective C 怪癖之一?)。
最佳答案
没有。正如您的示例所示,您没有基于确定范围的 ObjC 对象销毁。
例如,这个程序可能会导致死锁:
{ MyResourceGuard* guard = [MyResourceGuard new]; }
{ MyResourceGuard* guard = [MyResourceGuard new]; }
如果您需要此功能,最好的办法是使用 C++ 类型 ( SBRM, RAII )——在 Objective-C++ 中也可用(但不适用于 objc 对象)。
它接近了,但是您只需要等到引用计数达到零才能调用 -dealloc
,这就是保证失效的原因(通常 != always).这个问题实际上与为什么你永远不会依赖或使用 -retainCount
(如果它可用)非常相似。示例:自动释放池、异常、对运行时或 ARC 生成代码的更改、编译器优化、使用具有不同代码生成标志的实现可能会导致 objc 对象的生命周期延长到超出范围。
更新
whole page on ARC at clang's site是关于这个主题的好读物——包括细节、保证(和缺乏保证),但特别是:
6.1. Precise lifetime semantics
In general, ARC maintains an invariant that a retainable object pointer held in a __strong object will be retained for the full formal lifetime of the object. Objects subject to this invariant have precise lifetime semantics.
By default, local variables of automatic storage duration do not have precise lifetime semantics. Such objects are simply strong references which hold values of retainable object pointer type, and these values are still fully subject to the optimizations on values under local control.
Rationale: applying these precise-lifetime semantics strictly would be prohibitive. Many useful optimizations that might theoretically decrease the lifetime of an object would be rendered impossible. Essentially, it promises too much.
A local variable of retainable object owner type and automatic storage duration may be annotated with the objc_precise_lifetime attribute to indicate that it should be considered to be an object with precise lifetime semantics.
Rationale: nonetheless, it is sometimes useful to be able to force an object to be released at a precise time, even if that object does not appear to be used. This is likely to be uncommon enough that the syntactic weight of explicitly requesting these semantics will not be burdensome, and may even make the code clearer.
即使您确实使用了 objc_precise_lifetime
属性,它也会应用于该强局部变量 的引用计数操作——而不是对象的生命周期。
关于objective-c - ARC 是否保证在最后一个强引用消失后立即释放对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13417287/
1、前言 在数字化时代,自动化工具成为了提升工作效率和生产力的重要手段。Python作为一种广泛使用的编程语言,以其强大的功能和易用性受到许多开发者的青睐。 而今天给大家推荐一款开源的自动化脚本工具
我有一个 UIViewController,它引用了一个重复调用闭包的 Timer 对象。 Timer 对象在其 block 中捕获 self。据我所知,这会导致 View Controller 和
在当今软件开发的快速迭代中,接口自动化测试已成为确保代码质量和服务稳定性的关键步骤。 随着微服务架构和分布式系统的广泛应用,对接口自动化测试平台的需求也日益增长。 今天,我将为大家推荐一款强大的开
这个问题在这里已经有了答案: Is Python strongly typed? (13 个答案) 关闭 9 年前。 我了解到 Python 是一种强动态类型的语言。 动态:变量的类型在执行时确定,
想象以下使用手动内存管理(也称为非 ARC)的场景: 我有一个将 block 传递给类方法的 VC。在执行 block 之前,VC 从 UINavigationController 中弹出。 __bl
我已阅读this article关于Java中不同类型的引用(强引用、软引用、弱引用、幻像引用),但我不太理解。 这些引用类型之间有什么区别?每种类型何时使用? 最佳答案 Java 提供了两种不同类型
我需要两个选择器: 一个用于 h2 元素中的普通文本 还有一个用于 strong 标记内的文本 第一个是与: 选择器:'h2.flashHeader' 但是 选择器:'h2.flashHeader S
`我承认我不是 ARC 和保留周期方面的专家,尽管通过一些研究和一些很棒的文章(如 this),我相信我已经掌握了基础知识。 但是,我现在很困惑。我有一个属性定义如下。 @property (nona
就像这是非原子的 COPY 的 Setter @property (copy, nonatomic) NSString *someString; -(void)setSomeString:(NSStr
我有一个按钮的以下操作,它切换一个对象是显示为最喜欢的还是不最喜欢的: - (IBAction)addToFavorites:(UIButton *)sender { if ([object is
这个问题在这里已经有了答案: How to make my font bold using css? (10 个答案) 关闭 3 个月前。 在我网页上的整个文本和标题中,我需要将某些词加粗,而其他词
在我的项目中,我使用了 Storyboard,当我访问一个 UI 元素时,我创建了一个属性并将其链接。这个属性很弱。据我了解,该属性可能很弱,因为它已经添加到 View 中并且 View 保留了它。
我正在寻找有关 TLS/SSL 密码套件强度的信息。 例如,当在 chrome 上按 F12 时,会出现一个包含密码协议(protocol)和套件信息的安全概览选项卡。 Chrome 安全选项卡示例:
我使用 Xcode 中的分析工具(分配)发现的是,当您清零一个属性时,它不会被释放,直到父类被清空。现在假设你想确保你不会在内存中保留一个昂贵的模态视图 Controller (假设它不会经常使用),
下面的 Parent 类具有对单个子对象的强引用和弱引用。永远不会释放子对象。移除弱引用, child 就被释放了。 需要调用 Mirror 方法来进行此泄漏,但我不明白为什么使用 Mirror 会导
1、引言 在当今的互联网时代,API(应用程序编程接口)已经成为连接不同软件系统的桥梁。作为一名开发者,掌握API测试技能至关重要。市面上的API测试工具琳琅满目,今天我们要介绍的是一款开源、跨平台
大家好,我是狂师! 今天给大家推荐一款开源的HTTP测试工具:Hurl,相比curl、wget功能更强大,且更容易上手、很适用新手使用。 1、项目介绍 Hurl是一个使用Rust语言开发的命令行
当我从 Storyboard 控制拖动导出时,默认情况下我得到了 strong 属性。我正在使用 Xcode 9.4.1 .以下代码是它的样子。是不是因为 XCode 与 Swift 兼容,所以在 S
这两个Objective-C声明之间有什么区别? 我一直在看一些Apple源代码示例,他们在各种情况下都使用了第二个示例。我只是想了解为什么和何时最好使用第二个版本而不是第一个版本(我知道 stron
我已经在 AWS Linux 实例上安装了 Strong-pm: [root@box]# npm -g install strongloop strong-pm [root@box]# sl-pm-i
我是一名优秀的程序员,十分优秀!