我读过一篇文章,提到使用allocWithZone
有助于通过使用更接近对象本身的内存位置来提高性能。这是真的?是否建议使用allocWithZone
代替alloc
? alloc和allocWithZone有什么区别?
证明的例子是:
- (id)init
{
if (self = [super init])
{
_myString = [[NSString allocWithZone:[self zone] init]];
}
return self;
}
答案 0 :(得分:3)
First ARC禁止在对象上调用zone
。由于所有事情都在以这种方式移动,这似乎是不使用allocWithZone
的充分理由。
我知道使用allocWithZone
有一个很好的用途,符合NSCopying
。
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
虽然你可以完全忽略zone参数,但我喜欢这样做:
-(id)copyWithZone:(NSZone *)zone{
SampleClass *copy = [[SampleClass allocWithZone:zone] init];
copy->_myString = [_myString copyWithZone:zone];
return copy;
}
除此之外,我认为除了张贴previous question之外,还有更多话要说。
答案 1 :(得分:2)
直接来自the horse's mouth:
不再需要使用NSZone - 无论如何它们都会被现代Objective-C运行时忽略
(这是来自ARC发行说明,对于那些在Apple再次破坏其文档结构后阅读此内容的人。)
内存区域曾经有点有用,但Cocoa已经彻底摆脱了它们。 NSZone就像一个残留的尾巴,ARC和libauto GC都将它切断了。正如Apple工程师Bill Bumgarner在关于bryanmac欺骗的评论中指出的那样,他们只是笨拙而且在Cocoa中并没有发挥很大作用。