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


83

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

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

Answers:


126

更新的文档更改答案

现在,该信息分布在文档中的多个指南中。以下是必读内容的列表:

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

赋值与弱化-使用赋值将属性的指针设置为对象的地址,而不保留该对象或对其进行策展;如果分配给它的对象被释放,请使用weak使属性自动指向nil。在大多数情况下,您将希望使用函数,因此,EXC_BAD_ACCESS如果未执行适当的清理操作,就不会尝试访问释放对象(非法访问内存地址-“ ”)。

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


2
谢谢dude,我从Apple Dev上学习了我目前的开发基础知识,在内存管理上遇到了困难,“陷入了objc_msgSend()”的困扰,所以我只是想修改一下我对属性的理解。 stackoverflow.com/questions/4506205/...
院乙

2
请注意,答案的链接转到了Apple网站上的通用“找不到页面”。然后将其重定向到“ Mac Developer Library”。此SO答案具有有用的信息:stackoverflow.com/questions/2255861/…–
hippeelee

1
有点难以更新,因为文档已更改,不再放在一个方便的位置。已将反馈发送给Apple文档团队。
2014年

33

iOS参考库中的《内存管理编程指南》具有类推和示例的分配,复制和保留的基础。

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

保留将对象的保留计数增加1。获得对象的所有权。

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


感谢您的答复。请您解释一下。1.ClassA有一个名为-(Class B *)functionName的属性;2.ClassB有方法–(void)setHeight; 3.ClassC接口我已经声明ClassA * tempA为保留。4.在构造函数中的C类实现我有以下语句ClassB * tempB = tempA.functionName; 5,当我尝试在tempB初始化的下一行发送消息(tempB。setHeight;)时,我的程序运行正常。
Sabha B 2010年

6,将相同的语句(tempB.setHeight;)放入某个函数并调用该函数,我的程序在objc_msgSend()中崩溃。
Sabha B 2010年

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"
)

2
周围的解释会严重改善您的答案。
zx485 '16

4
  1. 分配

    • 分配是默认属性属性
    • Assign是一个属性,它告诉编译器如何综合该属性的setter实现
  2. 复制:

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

    • 指定新值应在分配时“保留”发送,旧值应“释放”发送
    • 如果您写保留,它将自动像强
    • 诸如“分配”之类的方法包括一个隐式“保留”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.