Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone alloc、retain和copy之间有什么区别_Iphone_Objective C_Memory Management - Fatal编程技术网

Iphone alloc、retain和copy之间有什么区别

Iphone alloc、retain和copy之间有什么区别,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,这似乎是一个简单的问题,但我真的不知道什么时候应该使用alloc、retain或copy Alloc:当需要进行内存分配时(要创建对象,需要为其分配内存空间) 每个对象都有一个保留计数,该计数指示在该对象中拥有所有权权益的对象的数量。它是通过alloc和copy自动完成的(copy表示您需要该对象的副本)。但是你也可以通过使用retain关键字来实现 当retain count==0时,将调用对象dealloc方法,并释放在该对象中进行的所有分配 我希望这足够清楚。 如果您想了解更多信息:请阅读

这似乎是一个简单的问题,但我真的不知道什么时候应该使用alloc、retain或copy

Alloc:当需要进行内存分配时(要创建对象,需要为其分配内存空间)

每个对象都有一个保留计数,该计数指示在该对象中拥有所有权权益的对象的数量。它是通过alloccopy自动完成的(copy表示您需要该对象的副本)。但是你也可以通过使用retain关键字来实现

当retain count==0时,将调用对象dealloc方法,并释放在该对象中进行的所有分配

我希望这足够清楚。 如果您想了解更多信息:

请阅读有关内存管理的详细教程。阅读全文可能需要一些时间,但它很好地解释了基本内容

编辑:关于复制- 当您使用retain时,您只是在增加对象的retain计数。但使用“复制”时,将创建对象的单独副本(浅副本)。分离表示它是保留计数为1的不同对象

比如说,

NSObject *obj1 = [[NSObject alloc] init]; // obj1 has retain count 1 // obj1 and obj2 both refer same object. now retain count = 2 // any change via obj1 will be seen by obj2 and vice versa, as they point same object NSObject *obj2 = [obj1 retain]; // obj3 is a separate copy of the object. its retain count is 1 just like newly allocated object // change via obj3 will not affect obj1 or obj2 and vice versa as they are separate objects NSObject *obj3 = [obj1 copy]; NSObject*obj1=[[NSObject alloc]init];//obj1具有保留计数1 //obj1和obj2均指同一对象。现在保留计数=2 //通过obj1的任何更改都将被obj2看到,反之亦然,因为它们指向同一对象 NSObject*obj2=[obj1保留]; //obj3是对象的单独副本。它的保留计数为1,就像新分配的对象一样 //通过obj3进行的更改不会影响obj1或obj2,反之亦然,因为它们是单独的对象 NSObject*obj3=[obj1拷贝];
谢谢本教程确实解释了retain的含义和许多基本的内存管理,但它没有真正解释copy方法的作用。还有关于内存管理或alloc内存部分的教程吗?另外,当你有时间的时候,检查William Remacle建议的内存管理细节指南。值得注意的是,在不可变的基础类(例如,代码> NSCORS/<代码>,<代码> NSArray < /代码>等)下,<>代码>拷贝<代码>并不总是创建一个“对象的单独拷贝”。不需要复制对象,因为它永远不会更改--
-copy
方法只是保留对象。