我看到有人声称以下内容“几乎等同”:
foo([NSString stringWithString:@"blah"]) # version 1
foo([[[NSString alloc] initWithString:@"blah"] autorelease]) # version 2
上述内容是否完全等同?还是有微妙的区别?选择其中一种的原因是什么?
我看到有人声称以下内容“几乎等同”:
foo([NSString stringWithString:@"blah"]) # version 1
foo([[[NSString alloc] initWithString:@"blah"] autorelease]) # version 2
foo(@"blah")
在大多数情况下,唯一的区别是额外调用了objc_msgSend
。
反编译NSString会发现,它发送的不是+alloc
,而是+allocWithZone:NSDefaultMallocZone()
。
+stringWithString:或+array等方法只是方便的方法,它们总是返回自动释放的对象。这些方法主要用于减少创建频繁的类(如字符串、数组、字典、数字等)所需编写的代码量。它们严格遵循基本的内存管理规则,其中我提到的那个规则也是从中得出的。