2009-09-15 45 views
0

好吧我有一個難以追蹤這個內存泄漏的世界。運行這個腳本時,我沒有看到任何內存泄漏,但我的對象正在爬升。 Instruments指向CGBitmapContextCreateImage> create_bitmap_data_provider> malloc,這佔用了我objectalloc的60%。iPhone - UIImage泄漏,ObjectAlloc建設

該代碼被稱爲NSTimer多次。

如何在我返回後清除reUIImage?

...或者我怎樣才能讓UIImage imageWithCGImage不會構建我的ObjectAlloc?

//I shorten the code because no one responded to another post 
    //Think my ObjectAlloc is building up on that retUIImage that I am returning 
    //**How do I clear that reUIImage after the return?** 

-(UIImage) functionname { 
    //blah blah blah code 
    //blah blah more code 

    UIImage *retUIImage = [UIImage imageWithCGImage:cgImage]; 
      CGImageRelease(cgImage); 

      return retUIImage; 
    } 

回答

1

您使用的此方法實例化UIImage並將其設置爲autorelease。如果你想清理這些,你需要清空水池定期

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
.. 
.. 
.. 
[pool release]; 

注意,這些可以被嵌套:

NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init]; 
NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init]; 
.. 
.. 
.. 
[pool2 release]; 
[pool1 release]; 

常見的做法是圍繞把這些for循環等方法,使許多自動釋放的對象。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
for (Thing *t in things) { 
    [thing doAMethodThatAutoreleasesABunchOfStuff]; 
} 
[pool release] 
+0

我已經看到NSAutoreleasePool像這樣發佈...... [pool drain]哪種方式是正確的? [池漏]或[池釋放]? – bbullis21 2009-09-16 02:09:09

+0

來自文檔: 在引用計數的環境中,此方法的行爲與發佈相同。由於無法保留自動釋放池(請參閱保留),因此會導致接收器被釋放。當一個自動釋放池被釋放時,它向所有的自動釋放對象發送釋放消息。如果一個對象被多次添加到同一個池中,當池被釋放時,它會在每次添加時收到一條釋放消息。 該手機沒有垃圾回收 – coneybeare 2009-09-16 02:30:00

+0

從評論中不清楚,但該描述來自drain方法 – coneybeare 2009-09-16 02:30:35