gpt4 book ai didi

ios - ARC dealloc 的 Hook 结束

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:16 28 4
gpt4 key购买 nike

给出以下简单实现:

@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 arrfinished nullingdeallocateddeallocateddeallocated

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

这个问题的目的实际上是为了更多地了解 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com