我是Objective C的新手。我有C的基本知识,包括指针的概念。我有两个基本问题:
答案 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)
分配
副本:
保留: