我是Objective C的新手。我具有C的基本知识,包括指针的概念。我有两个基本问题:
- 有人可以比喻解释分配,复制和保留之间的区别吗?
- 如何处理返回指针变量的函数,以及如何通过返回指针执行消息传递?
Answers:
更新的文档更改答案
现在,该信息分布在文档中的多个指南中。以下是必读内容的列表:
现在,此问题的答案完全取决于您使用的是ARC管理的应用程序(新项目的现代默认设置)还是强制进行手动内存管理。
赋值与弱化-使用赋值将属性的指针设置为对象的地址,而不保留该对象或对其进行策展;如果分配给它的对象被释放,请使用weak使属性自动指向nil。在大多数情况下,您将希望使用弱函数,因此,EXC_BAD_ACCESS
如果未执行适当的清理操作,就不会尝试访问释放对象(非法访问内存地址-“ ”)。
保留与复制-默认情况下,声明的属性使用保留(因此您可以完全省略它),无论是将另一个对象分配给该属性还是将其设置为nil,它都会自动管理对象的引用计数。使用copy自动向新分配的对象-copy
发送消息(这将创建传递的对象的副本,并将该副本分配给属性)-在某些情况下(在将分配的对象设置为其他对象的属性(这意味着修改/突变也将应用于该属性)。
iOS参考库中的《内存管理编程指南》具有类推和示例的分配,复制和保留的基础。
复制 复制对象,并以保留计数1返回它。如果复制对象,则您拥有该副本。这适用于任何包含单词copy的方法,其中“ copy”是指要返回的对象。
保留将对象的保留计数增加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"
)