【问题标题】:Objective-C ARC Minor PerformanceObjective-C ARC 次要性能
【发布时间】:2015-08-03 22:36:04
【问题描述】:

我只是好奇 ARC 编译是否会在以下示例中优化内存性能:

1| - (void)setName:(NSString *)name
2| {
3|    _name = name;
4|   if([name isEqualToString:@"Name"])
5|       NSLog(@"%@", @"It's Equal!");
6| }

与第二次不使用第 4 行的本地 name 变量的细微差别

1| - (void)setName:(NSString *)name
2| {
3|    _name = name;
4|   if([_name isEqualToString:@"Name"])
5|       NSLog(@"%@", @"It's Equal!");
6| }

ARC 是通过仅将本地 name 变量保留在内存中来优化内存性能吗两个例子的方法都完整吗?希望我的问题有意义。

【问题讨论】:

  • 您查看过生成的程序集(或 IR)输出吗?

标签: objective-c memory automatic-ref-counting


【解决方案1】:

这两组代码的唯一区别是if 语句中使用的变量。这种微小的差异与name_name 的分配完全没有关系。两组代码之间的内存管理没有什么不同。

在这两组代码中,_name = name; 行本质上变为(在 ARC 下):

if (_name != name) {
    [_name release];
    _name = [name retain];
}

您的if 语句及其使用的变量与该代码完全无关。

请记住,name 由调用 setName: 方法的任何代码“拥有”。 setName: 方法永远不会尝试释放name。指向name 的对象将通过保持对它的引用而保存在内存中。

【讨论】:

  • 谢谢!这很有帮助!所以我在 if 语句或任何后续语句中使用哪一个并不重要?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2011-11-01
  • 2012-06-01
相关资源
最近更新 更多