来自forum discussion,看起来差别很大的是性能因素,allocWithZone:将从特定内存区域分配内存,从而降低交换成本。
在实践中,几乎没有机会使用allocWithZone:,任何人都可以给出一个简单的例子来说明使用allocWithZone的情况:?
谢谢,
答案 0 :(得分:47)
当一个对象创建另一个对象时,它就是 有时一个好主意,以确保 它们都是从同一个分配的 记忆区域。区域方法 (在NSObject协议中声明) 可以用于此目的;它 返回接收者所在的区域 位于。
这向我表明,你的ivars以及你的课程“自己创建”的任何对象都可以通过这种方式使用+allocWithZone:
来制作他们在同一区域中创建的实例。
-(id)init {
if (self = [super init]) {
someIvar = [[SomeOtherClass allocWithZone:[self zone]] init];
}
return self;
}
答案 1 :(得分:30)
来自Apple的documentation:
此方法存在历史原因;内存区域不再存在 由Objective-C使用。
答案 2 :(得分:5)
使用allocWithZone的一个很好的例子:当您实现NSCopy协议时,它允许您使自定义对象可以复制(按值深度复制/复制),如:
(1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it
NSCopy协议确保您实现方法:
(2) -(id)copyWithZone:(NSZone *)zone;
当复制对象时,如上所述发送的“复制”消息(1)当声明为'copyWithZone时,向方法(2)发送消息。也就是说你不需要做任何事来自己获得一个区域。
现在,当您向此邮件发送“区域”时,您可以使用它来确保从与原始邮件相同的区域中的内存进行复制。
这可以像:
一样使用-(id)copyWithZone:(NSZone *)zone
{
newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning
return(newCopy);
}
这是我唯一知道allocWithZone实际使用的地方。
答案 3 :(得分:2)
我在单身人士中使用allocWithZone
。正如福雷斯特所提到的,创建的变量是从相同的内存区域分配的。因此,其他类可以从相同的内存区域使用或访问它们。运行应用程序时节省内存空间。
答案 4 :(得分:2)
在Foundation Functions Reference中,所有Zone
函数现在都以下面的警告开头,即区域将被忽略。
OS X上的iOS和64位运行时将忽略区域。您不应在当前开发中使用区域。
NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone
答案 5 :(得分:0)
即使Apple的文档指出allocWithZone:
由于历史原因而存在; Objective-C不再使用内存区域。您不应该覆盖此方法。
和
OS X上的iOS和64位运行时将忽略区域。您不应在当前开发中使用区域。
实际上我在Objective-C类中(在一个完整的Objective-C项目中)覆盖它,当我执行[[Mylass alloc] init]
时调用该方法,即使构建在iPhone 6s上运行。
但我认为最好遵循文档并覆盖alloc
方法而不是这个方法,因为alloc当然可以做同样的工作。