【问题标题】:In ARC, what happens to the memory of an object that is reinitialized?在 ARC 中,重新初始化的对象的内存会发生什么变化?
【发布时间】:2023-04-05 16:09:01
【问题描述】:

假设我有一个名为 test 的方法。

test{
    NSString *answer = [[NSString alloc] initWithString:@"VALUE 1"];
    answer = [[NSString alloc] initWithString:@"VALUE 2"];
}

当 answer 重新初始化时,ARC 下第一次初始化的内存会发生什么变化?

【问题讨论】:

  • 第二行有一个无关的@
  • 请注意 NSString *answer = [[NSString alloc] initWithString:@"VALUE 1"];与 NSString 完全相同 *answer = @"VALUE 1";
  • 它去了 NSObject 天堂。如果它很好,它可能会转世为 NSNumber 或 UIImage。
  • @Catfish_Man - 不完全是。第一个需要创建一个包含字节“VALUE 1”的新 NSString 对象。第二个简单地使用“interned”文字字符串。
  • @HotLicks,这实际上不是必需的。在这两种情况下,您都会得到一个带有当前编译器/运行时的静态分配字符串。

标签: ios memory-management automatic-ref-counting


【解决方案1】:

第一个字符串被释放([[NSString alloc] initWithString:@"VALUE 1"];创建的字符串)

answer 在这种情况下是具有 strong 所有权资格的对象。所以从docs,当你分配给answer时会发生这种情况:

对于__strong对象,首先保留新的pointee;其次,左值加载了原始语义;第三,新的指针对象以原始语义存储到左值中;最后,旧指针被释放。这不是原子执行的;面对并发加载和存储时,必须使用外部同步来确保安全。

【讨论】:

  • 你知道 ARC 处理哪些对象,哪些不处理?
  • ARC 管理 Objective-C 对象,包括块。它不管理 CoreFoundation 对象、C++ 对象或您使用 [mc]alloc 自己分配的任何内存。是这个意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多