我是 Objective C 的新手。我有 C 的基本知识,包括指针的概念。我有两个基本问题:
有人可以用一些类比来解释分配、复制和保留之间的区别吗?您如何处理返回指针变量的函数,以及如何通过返回指针执行消息传递?
已更改文档的更新答案
该信息现在分布在文档中的多个指南中。以下是必读清单:
Cocoa 核心能力:申报财产
使用 Objective-C 编程:封装数据
过渡到 ARC 发行说明
高级内存管理编程指南
Objective-C 运行时编程指南:声明的属性
这个问题的答案现在完全取决于您是使用 ARC 管理的应用程序(新项目的现代默认设置)还是强制手动内存管理。
Assign vs. Weak - 使用 assign 将属性指针设置为对象的地址,而不保留它或以其他方式管理它;如果分配给它的对象被释放,则使用 weak 使属性自动指向 nil。在大多数情况下,您会想要使用 weak,这样您就不会尝试访问已释放的对象(内存地址的非法访问 - “EXC_BAD_ACCESS
”),如果您不执行适当的清理操作.
保留 vs. 复制 - 声明的属性默认使用 retain(因此您可以完全省略它),并且无论是否将另一个对象分配给该属性,都会自动管理对象的引用计数或者设置为零;使用 copy 自动向新分配的对象发送 -copy
消息(这将创建传递对象的副本并将该副本分配给属性 - 在某些情况下很有用(甚至是必需的)分配的对象可能在被设置为其他对象的属性后被修改(这意味着修改/变异也将应用于该属性)。
iOS 参考库中的 Memory Management Programming Guide 通过类比和示例具有分配、复制和保留的基础知识。
复制一个对象的副本,并返回它,保留计数为 1。如果您复制一个对象,则您拥有该副本。这适用于任何包含单词 copy 的方法,其中“copy”指的是返回的对象。 retain 将对象的保留计数增加 1。获取对象的所有权。 release 将对象的保留计数减 1。放弃对象的所有权。
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"
)
assign 分配是一个默认属性属性分配是一个属性属性告诉编译器如何合成该属性的设置器实现副本:当对象是可变的时需要复制副本返回一个您必须显式释放的对象(例如,在 dealloc 中)垃圾收集环境,您需要在完成对象后释放它,因为您要保留副本保留:指定新值应在分配时发送“-retain”,如果您编写保留,则应发送旧值“-release”它会自动work like strong 像“alloc”这样的方法包括一个隐含的“retain”
不定期副业成功案例分享