目标C - 分配,复制,保留

时间:2010-12-22 15:51:18

标签: ios objective-c macos memory-management attributes

我是Objective C的新手。我有C的基本知识,包括指针的概念。我有两个基本问题:

  1. 有人能解释分配,复制和保留之间的区别吗?
  2. 如何处理返回指针变量的函数,以及如何通过返回指针执行消息传递?

4 个答案:

答案 0 :(得分:117)

更新了已更改文档的答案

现在,信息分散在文档中的几个指南中。以下是所需阅读清单:

现在,这个问题的答案完全取决于您是使用ARC托管的应用程序(新项目的现代默认设置)还是强制手动内存管理。

分配与弱 - 使用分配设置属性指向对象地址的指针,而不保留或以其他方式进行策划;如果取消分配分配给它的对象,则使用使属性自动指向nil。在大多数情况下,您需要使用,这样您就不会尝试访问已解除分配的对象(非法访问内存地址 - “EXC_BAD_ACCESS”)如果您不执行适当的清理。

保留与复制 - 声明的属性默认情况下使用保留(因此您可以完全省略它)并自动管理对象的引用计数,无论是否分配了另一个对象到该物业或它设定为零;使用复制自动向新分配的对象发送-copy消息(这将创建传递的对象的副本,并将该副本分配给属性 - 在某些情况下有用(甚至是必需的)在被设置为某个其他对象的属性后,可能会修改已分配对象的情况(这意味着修改/变异也将适用于该属性)。

答案 1 :(得分:31)

iOS参考库中的Memory Management Programming Guide具有使用类比和示例进行分配,复制和保留的基础知识。

  

复制   制作一个对象的副本,并以保留计数1返回它。   如果复制对象,则拥有该副本。这适用于包含单词copy的任何方法,其中“copy”指的是要返回的对象。

     

保留将对象的保留计数增加1.取得所有权   一个对象。

     

发布减少对象的保留计数1.放弃   对象的所有权。

答案 2 :(得分:6)

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)

答案 3 :(得分:4)

  1. 分配

    • assign是默认属性属性
    • assign是一个属性属性,告诉编译器如何合成属性的setter实现
  2. 副本:

    • 当对象可变时需要复制
    • copy返回一个必须在非垃圾回收环境中显式释放的对象(例如,在dealloc中)
    • 您需要在完成后释放该对象,因为您保留了副本
  3. 保留:

    • 指定新值应在分配时发送“-retain”并且旧值发送“-release”
    • 如果你写保留它会像强大的
    • 一样自动工作
    • 像“alloc”这样的方法包括一个隐含的“retain”