alloc,copy和new有什么区别?

时间:2011-05-27 13:12:19

标签: ios4 memory-management

alloc,copy和new之间的实际区别是什么,以及assign和nonatomic属性如何。

1 个答案:

答案 0 :(得分:5)

  • 的alloc

alloc是一个类选择器(例如,用于举例)

[NSObject alloc]

它返回NSObject *类型的非初始化指针。

  • 初始化

要完成初始化,您必须在实例本身上调用正确的指定初始值设定项:

[[NSObject alloc] init]

将返回一个可用的NSObject *指针。

新的基本上是一个alloc - > init除了在类级别直接调用之外:

NSObject* aObj = [NSObject new]
NSObject* aObj = [[NSObject alloc] init]

相似。

  • 非原子

非原子属性意味着当写入属性时(在设置调用期间为ex)将不会对此属性合成的变量添加锁定(这意味着没有过多的时间消耗@synchronize)

因此,如果您的属性不会同时被不同的线程更改,您可以安全地将其设置为非原子。

  • 复制

复制属性意味着当您修改该属性时:

aObj.copyProperty = otherValue

copyProperty 变量会将copyWithZone:信号发送到 otherValue 对象。

换句话说,如果您的 copyProperty 符合 NSCopying 协议,它最终将具有与 otherValue 相同的属性,但会拥有它自己的地址和保留计数,因此位于内存的完全不同的部分,因为 otherValue 是。

基本上 copyProperty 将占用与 otherValue 一样多的内存空间。

  • 指定

分配属性意味着当你这样做时:

aObj.prop = aProperty

由属性 prop 合成的变量将直接分配给属性,这意味着它们将共享完全相同的地址并保留计数

使用assign时没有占用额外的内存空间

我希望这会对你有所帮助。有关详细信息,请阅读Apple Memory Management Documentation