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
。因此,编译器无法调用objecttracker
的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
有有趣的行为)<代码>自动释放<