alloc,copy和new有什么区别?

Ank*_*yas 4 memory-management ios4

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

apo*_*che 5

  • ALLOC

alloc是一个Class选择器(用于举例说明)

[NSObject alloc]
Run Code Online (Sandbox Code Playgroud)

它返回一个NSObject*类型的非初始化指针.

  • 在里面

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

[[NSObject alloc] init]
Run Code Online (Sandbox Code Playgroud)

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

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

NSObject* aObj = [NSObject new]
NSObject* aObj = [[NSObject alloc] init]
Run Code Online (Sandbox Code Playgroud)

是相似的.

  • 非原子

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

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

  • 复制

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

aObj.copyProperty = otherValue
Run Code Online (Sandbox Code Playgroud)

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

换句话说,如果你的copyProperty是符合的NSCopying协议最终将具有相同的属性otherValue,但将有它自己的地址,并保留计数,因此在存储的完全不同的部分被定位为otherValue了.

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

  • 分配

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

aObj.prop = aProperty
Run Code Online (Sandbox Code Playgroud)

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

使用assign时不会占用额外的内存空间.

我希望这可以帮助你.有关详细信息,请阅读Apple内存管理文档