Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.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 多次使用的类方法是否会导致泄漏?_Iphone_Xcode_Memory_Autorelease - Fatal编程技术网

Iphone 多次使用的类方法是否会导致泄漏?

Iphone 多次使用的类方法是否会导致泄漏?,iphone,xcode,memory,autorelease,Iphone,Xcode,Memory,Autorelease,假设我正在开发一个游戏。我多次运行以下类方法: NSBundle*bundle=[NSBundle mainBundle] 我不会创建自动释放池,也不会一直释放调用上述类方法的对象。我创建了一个对象,它调用了上面的类方法,我释放了它,并且不断地释放了数千次 3个问题: 内存泄漏了吗 如果我跑: NSAutoReleasePool*池=[[NSAutoReleasePool alloc]init]; [泳池排水沟] 然后它会有效地释放在类方法中创建的所有NSBundle吗 如果我写: 池=

假设我正在开发一个游戏。我多次运行以下类方法:

NSBundle*bundle=[NSBundle mainBundle]

我不会创建自动释放池,也不会一直释放调用上述类方法的对象。我创建了一个对象,它调用了上面的类方法,我释放了它,并且不断地释放了数千次

3个问题:

  • 内存泄漏了吗
  • 如果我跑:
NSAutoReleasePool*池=[[NSAutoReleasePool alloc]init]; [泳池排水沟]

然后它会有效地释放在类方法中创建的所有NSBundle吗

  • 如果我写:
池=零

而不是写:

[泳池排水沟]

能否达到同样的效果?这是好的做法吗

这三个问题是相互关联的,我将进一步澄清这三个问题:)

  • 不,内存没有泄漏
    [NSBundle mainBundle]
    返回自动释放的对象,因此自动释放池将处理该对象。然而,如果您要在一个函数或其他函数中多次调用它,最好是获得一次对它的引用并在需要时保持它,或者创建自己的自动释放池
  • 不完全是。
    NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init]之后的所有内容将进入
    ,在您排空池后,它们将被释放。注:
    [pool drain]
    也会释放池,所以不要调用
    [pool drain];[池释放]
    或者您将向对象发送两次
    release
    消息,可能会崩溃
  • 编号
    pool=nil
    将丢失对
    的引用,实际的
    对象将泄漏。您必须调用
    [pool drain]
    [池释放]和良好实践是设置
    池=nil之后

  • 如果您没有创建自动释放池,并且其中一个还不存在,则自动释放的任何对象(由您或您正在使用的其他库)都将泄漏

    设置池=零;除了泄漏整个池之外,什么都不做,如果池设置在属性中,例如

     @property(nonatomic, retain) NSAutoreleasePool *pool;
    
     self.pool = [[[NSAutoreleasePool alloc] init] autorelease];
    
     //now, self is the sole retainer of pool, so if self abandons it it gets drained:
    
     self.pool = nil;
    
     //pool's retain count drops to zero, pool drains.
    

    如果你这样做几千次,它可能会慢下来,每次都要把池排掉,考虑每5或十次做一次,在循环中设置一个计数器,当它命中某个决定的数字时,这样做:

     self.pool = [[[NSAutoreleasePool alloc] init] autorelease];
     //this will get rid of the old pool and put in a new one, so you only have to get rid of the one remaining at the end of the loop.
    

    1.所以你说的是内存没有泄漏,但也没有释放?我的池在一千次调用该类方法之后会有一千个对象等待自动释放?2.是的,我已经编辑过这个问题了,谢谢。但让我试着理解一下:当NSBundle自动删除它返回的对象时,它会自动转到我以前创建的池中吗?(假设我在调用NSBundle上的类方法之前,通过编写NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init]创建了一个池)3。明白了,谢谢。对,当你
    autorelease
    something时,你放弃了它的所有权,但它会一直存在,直到自动释放池现在拥有它的所有权为止。2.是 啊在这里,文档可能比我解释得更好:(阅读有关自动释放池和嵌套池范围的部分)。