Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
Objective c 自动释放的使用?_Objective C - Fatal编程技术网

Objective c 自动释放的使用?

Objective c 自动释放的使用?,objective-c,Objective C,我不清楚如何使用autorelease NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; RetainTracker* tracker = [RetainTracker new]; [tracker retain]; [tracker retain]; [tracker autorelease]; [pool release]; 上述代码中是否存在内存泄漏 我知道autorelease只将tracker放入NSAutorel

我不清楚如何使用
autorelease

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
RetainTracker* tracker = [RetainTracker new];
[tracker retain];
[tracker retain];
[tracker autorelease];
[pool release];
上述代码中是否存在内存泄漏

我知道
autorelease
只将
tracker
放入
NSAutoreleasePool
,而不修改
tracker
的引用计数。当我调用
[pool release]
时,对象收到一条消息
release
,那么
跟踪器的引用计数是
2
。因此,编译器无法调用object
tracker
dealloc
函数,因此内存泄漏

所以我明白了:我们应该同时调用
retain
release
,对吗?

,所以那一行的tracker上的retain计数是1

然后将保留计数再增加2次,使总保留计数为3


Autorelease将在释放池时释放跟踪程序()。但是它已经被保留了3次,所以它并没有真正被发布

是的,存在内存泄漏,保留计数大于0,并且在该方法之外没有对“
tracker
”的引用(也就是说,除非在实例变量中使用“
tracker
”)

了解内存管理的基础知识非常好;但如果你想省去一大堆头疼的事,就按照这里其他人说的去做,简单地启用ARC

编辑:为了完成您的问题,您应该确保每次调用retain都与发布保持平衡。您还需要执行一个“
new
”,这也会增加保留计数,因此您也需要“
release
”。

,因此该行的tracker上的保留计数为1

然后将保留计数再增加2次,使总保留计数为3


Autorelease将在释放池时释放跟踪程序()。但是它已经被保留了3次,所以它并没有真正被发布

是的,存在内存泄漏,保留计数大于0,并且在该方法之外没有对“
tracker
”的引用(也就是说,除非在实例变量中使用“
tracker
”)

了解内存管理的基础知识非常好;但如果你想省去一大堆头疼的事,就按照这里其他人说的去做,简单地启用ARC


编辑:为了完成您的问题,您应该确保每次调用retain都与发布保持平衡。您还需要执行“
new
”,这也会增加保留计数,因此您也需要“
release
”。

如果您是Objective-c新手,您应该使用自动引用计数。几乎每个人都应该这样做。但为了理解:

一个对象的引用计数是指有多少个对象引用它。当它降到零时,对象不被任何对象引用,并且被解除分配。Objective-C中的每个方法都负责释放它保留的任何对象。问题是,如果一个工厂方法的任务是创建一个对象,那么它就违反了规则,没有释放它保留的对象(在本例中,它是因为被创建而被保留的)。如果在返回对象之前对该对象调用了
release
,那么它将返回一个已经消失的对象的地址。因此,存在自动释放,它暂时延迟释放,直到调用方法可以保留被调用方法创建的对象


在上面的示例中,如果您去掉了2个reserves,并且只调用了autorelease,那么当autorelease池被释放并且(在释放之前)被耗尽时,对象将被释放和释放,这意味着它对其池中的所有对象调用release,tracker是其中之一,因为在tracker上调用autorelease将其添加到池中

如果您是Objective-c新手,应该使用自动参考计数。几乎每个人都应该这样做。但为了理解:

一个对象的引用计数是指有多少个对象引用它。当它降到零时,对象不被任何对象引用,并且被解除分配。Objective-C中的每个方法都负责释放它保留的任何对象。问题是,如果一个工厂方法的任务是创建一个对象,那么它就违反了规则,没有释放它保留的对象(在本例中,它是因为被创建而被保留的)。如果在返回对象之前对该对象调用了
release
,那么它将返回一个已经消失的对象的地址。因此,存在自动释放,它暂时延迟释放,直到调用方法可以保留被调用方法创建的对象


在上面的示例中,如果您去掉了2个reserves,并且只调用了autorelease,那么当autorelease池被释放并且(在释放之前)被耗尽时,对象将被释放和释放,这意味着它对其池中的所有对象调用release,tracker是其中之一,因为在tracker上调用autorelease将其添加到池中

不确定什么是
retainracker
,但您保留两次,然后只自动释放一次,所以是的,它会泄漏(除非
retainracker
有有趣的行为)
autorelease
就像调用
release
一样,就最终的保留计数而言,它只是等待池被释放后再应用。你可以用它让临时变量在语句中存活足够长的时间。顺便说一句,我支持Objective-C2.0
@autorelease{…}
,因为范围更清晰。+1用于提出一个好问题,让我在很长一段时间内第一次重新阅读内存管理文档。它实际上被保留了3次,
new
和两个
retain
无法确定
retainracker
是什么,但是您保留两次,然后只自动释放一次,因此是的,它会泄漏(除非
retainracker
有有趣的行为)<代码>自动释放<