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

Sab*_*a B 81 macos attributes memory-management objective-c ios

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

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

Jos*_*zzi 123

更新了更改文档的答案

现在,这些信息分散在文档中的几个指南中.这是一个必读的列表:

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

赋值与弱 - 使用assign设置属性指向对象地址的指针,而不保留它或以其他方式策划它; 如果取消分配分配给它的对象,则使用weak使属性自动指向nil.在大多数情况下,如果不进行适当的清理,你将需要使用弱,因此你不会尝试访问一个解除分配的对象(非法访问内存地址 - " EXC_BAD_ACCESS").

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

  • 谢谢老兄,我读了Apple Dev的基础知识,关于我目前的开发在内存管理方面遇到了困难"在objc_msgSend()中崩溃了"所以我只想修改我对属性的理解.http://stackoverflow.com/questions/4506205/application-crash-debug-says-objc-msgsend (2认同)
  • 只是提醒一下,答案的链接转到苹果网站上的通用"页面未找到".然后它重定向到"Mac Developer Library"这个SO答案有用的信息:http://stackoverflow.com/questions/2255861/property-and-retain-assign-copy-nonatomic (2认同)

Lar*_*ipp 33

iOS参考库中的" 内存管理编程指南"具有通过类比和示例进行分配,复制和保留的基础知识.

copy 复制一个对象,并以retain count为1返回它.如果复制一个对象,则拥有该副本.这适用于包含单词copy的任何方法,其中"copy"指的是要返回的对象.

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

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


sri*_*vas 8

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"
)
Run Code Online (Sandbox Code Playgroud)

  • 周围的解释会严重改善你的答案。 (4认同)

小智 5

    \n
  1. 分配

    \n\n
      \n
    • 分配是默认属性属性
    • \n
    • allocate是一个property属性,告诉编译器如何合成property\xe2\x80\x99s setter实现
    • \n
  2. \n
  3. 复制:

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

    \n\n
      \n
    • 指定分配时应发送新值 \xe2\x80\x9c-retain\xe2\x80\x9d 并发送旧值 \xe2\x80\x9c-release\xe2\x80\x9d
    • \n
    • 如果你写保留它会像强一样自动工作
    • \n
    • 像 \xe2\x80\x9calloc\xe2\x80\x9d 这样的方法包含隐式 \xe2\x80\x9cretain\xe2\x80\x9d
    • \n
  6. \n
\n