Objective-C ARC 次要表现
Objective-C ARC Minor Performance
我只是好奇 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
的一次赋值只在内存中保留局部name
变量然后释放,还是name
保留在内存中,直到两个示例的方法都完成?希望我的问题有道理。
两组代码的唯一区别是 if
语句中使用的变量。那个小区别对 name
到 _name
的赋值完全没有影响。你的两组代码之间的内存管理没有什么不同。
在两组代码中,行 _name = name;
基本上变为(在 ARC 下):
if (_name != name) {
[_name release];
_name = [name retain];
}
您的 if
语句及其使用的变量与该代码完全无关。
请记住,无论代码调用 setName:
方法,name
都是 "owned"。 setName:
方法永远不会尝试释放 name
。指向 name
的对象将由任何保持对它的引用的对象保存在内存中。
我只是好奇 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
的一次赋值只在内存中保留局部name
变量然后释放,还是name
保留在内存中,直到两个示例的方法都完成?希望我的问题有道理。
两组代码的唯一区别是 if
语句中使用的变量。那个小区别对 name
到 _name
的赋值完全没有影响。你的两组代码之间的内存管理没有什么不同。
在两组代码中,行 _name = name;
基本上变为(在 ARC 下):
if (_name != name) {
[_name release];
_name = [name retain];
}
您的 if
语句及其使用的变量与该代码完全无关。
请记住,无论代码调用 setName:
方法,name
都是 "owned"。 setName:
方法永远不会尝试释放 name
。指向 name
的对象将由任何保持对它的引用的对象保存在内存中。