ios - ARC dealloc 的 Hook 结束

标签 ios objective-c automatic-ref-counting dealloc

给出以下简单实现:

@implementation RTUDeallocLogger
-(void)dealloc
{
    NSLog(@"deallocated");
}
@end

我们在 ARC 下运行以下代码:

@implementation RTURunner
{
    NSArray* arr;
}
-(void)run{
    arr = [NSArray
           arrayWithObjects:[[RTUDeallocLogger alloc]init],
                            [[RTUDeallocLogger alloc]init],
                            [[RTUDeallocLogger alloc]init],
                            nil];
    NSLog(@"nulling arr");
    arr = NULL;
    NSLog(@"finished nulling");
}
@end

我们得到以下日志输出:

nulling arr
finished nulling
deallocated
deallocated
deallocated

我想在所有重新分配完成后执行一个操作。这可能吗?

这个问题的目的实际上是为了更多地了解 ARC 的机制,特别是 ARC 在什么时候触发这些释放,以及当我删除引用时这是否会同步发生。

最佳答案

-dealloc 始终是同步的,并且在删除最后一个强引用时发生。但是,对于您的代码, +arrayWithObjects: 很可能(如果至少在 -O0 编译)将数组放入自动释放池中,因此当池耗尽时删除最后一个强引用,而不是当您将变量设置为 NULL 时(你应该对 ObjC 对象使用 nil,顺便说一句)。

您可能可以通过使用 alloc/init 来创建来避免将对象放在自动释放池中,并且您可能(实现细节,bla bla)能够通过在启用优化的情况下进行编译来避免它.您还可以使用 @autoreleasepool { } 引入内部池并以这种方式绑定(bind)生命周期。

关于ios - ARC dealloc 的 Hook 结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14616119/

相关文章:

objective-c - 如何重新创建 Jetsetter 的 iOS 预告片照片和照片查看器幻灯片过渡?

ios - 跟踪 iOS 应用程序的任何用户交互

iphone - 命令/usr/bin/codesign 失败,退出代码为 1

iphone - 自定义键盘设置光标位置

ios - Objective-C : Infinite getter method loop after converting to ARC

ios - NSHashTable 保留弱引用

ios - 每次我打开项目时,Xcode 8.2.1意外退出

ios - 处理日光时差

ios - 在 UISegmentedControl 中换行文本 (iOS 9+)

ios - 使用 Arc 不保留函数参数?