ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有人可以用一些类比来解释分配、复制和保留之间的区别吗?您如何处理返回指针变量的函数,以及如何通过返回指针执行消息传递?


J
Joshua Nozzi

已更改文档的更新答案

该信息现在分布在文档中的多个指南中。以下是必读清单:

Cocoa 核心能力:申报财产

使用 Objective-C 编程:封装数据

过渡到 ARC 发行说明

高级内存管理编程指南

Objective-C 运行时编程指南:声明的属性

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

Assign vs. Weak - 使用 assign 将属性指针设置为对象的地址,而不保留它或以其他方式管理它;如果分配给它的对象被释放,则使用 weak 使属性自动指向 nil。在大多数情况下,您会想要使用 weak,这样您就不会尝试访问已释放的对象(内存地址的非法访问 - “EXC_BAD_ACCESS”),如果您不执行适当的清理操作.

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


谢谢老兄,我在目前的开发中阅读了 Apple Dev 的基础知识在内存管理方面遇到了困难“在 objc_msgSend() 中崩溃”所以我只是想修改我对属性的理解。 stackoverflow.com/questions/4506205/…
请注意,答案的链接指向苹果网站上的通用“未找到页面”。然后它重定向到“Mac Developer Library”这个 SO 答案有有用的信息:stackoverflow.com/questions/2255861/…
有点难以更新,因为文档已更改,并且不再在一个方便的地方。反馈已发送至 Apple 文档团队。
L
Larry Hipp

iOS 参考库中的 Memory Management Programming Guide 通过类比和示例具有分配、复制和保留的基础知识。

复制一个对象的副本,并返回它,保留计数为 1。如果您复制一个对象,则您拥有该副本。这适用于任何包含单词 copy 的方法,其中“copy”指的是返回的对象。 retain 将对象的保留计数增加 1。获取对象的所有权。 release 将对象的保留计数减 1。放弃对象的所有权。


感谢您的回复。请您解释一下 1.ClassA 有一个名为 - (Class B*)functionName; 的属性; 2.ClassB有方法——(void)setHeight; 3.ClassC 接口我已经将ClassA *tempA 声明为retain。 4.Class C在构造函数中的实现我有这个语句ClassB *tempB = tempA.functionName; 5.当我尝试在 tempB 初始化的下一行发送消息 (tempB.setHeight;) 时,我的程序工作正常。
6.将相同的语句(tempB.setHeight;)放入某个函数并调用相同的函数我的程序在objc_msgSend()中崩溃。
z
zx485
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"
)

周围的解释会严重改善你的答案。
C
Chen Rui

assign 分配是一个默认属性属性分配是一个属性属性告诉编译器如何合成该属性的设置器实现副本:当对象是可变的时需要复制副本返回一个您必须显式释放的对象(例如,在 dealloc 中)垃圾收集环境,您需要在完成对象后释放它,因为您要保留副本保留:指定新值应在分配时发送“-retain”,如果您编写保留,则应发送旧值“-release”它会自动work like strong 像“alloc”这样的方法包括一个隐含的“retain”