2009-01-09 69 views
1

我正在使用儀器來確定在我的應用程序中是否有地方可以使用內存來提高效率。我花時間去熟悉一些樂器,但我一般都是來自Java背景的尋找內存管理問題的新手。我似乎可以用約1.82MB通過調用這個方法:iPhone內存調試

+ (NSString *)stringFromDateWithFormat:(NSDate *)date withFormat:(NSString *)format 
{ 
    NSDateFormatter *dateFormatter; 
    NSString *result; 

    if (nil == date || nil == format) 
     return nil; 

    result = nil; 
    if (nil != (dateFormatter = [[NSDateFormatter allocWithZone:[self zone]] init])) { 
     [dateFormatter setDateFormat:format]; 

     if (nil != (result = [dateFormatter stringFromDate:date])) { 
      [dateFormatter release]; 
      return result; 
     } 

     [dateFormatter release]; 
    } 
    return nil; 
} 

正如我釋放的日期格式我想知道如果NSString的結果是我的問題。在我看來,stringFromDate庫調用將返回一個自動釋放對象,所以我無法「手動」管理它。有些不確定如何優化這種方法。

回答

4

該方法在循環中被調用了很多次嗎?自動釋放的對象只有在釋放它們所在的NSAutoreleasePool時纔會釋放。據我所知,默認的自動釋放池被創建並釋放每個事件循環。在單個事件循環的過程中,您可能會創建太多的自動釋放對象。解決方案是在適當的地方創建自己的NSAutoreleasePool,並釋放它以清除自動釋放的對象。一個極端的例子說明了這一點:

int i; 
NSAutoreasePool* pool = nil; 
for (i = 0; i < 1000000; ++i) { 
    /* Create a new pool every 10000 iterations */ 
    if ((i % 10000) == 0) { 
     if (pool) [pool release]; 
     pool = [[NSAutoreleasePool alloc] init]; 
    } 
    [someObj someMethodThatCreatesAutoreleasedObjects]; 
} 
[pool release]; 

在該示例中,每10,000次迭代釋放當前池並創建一個新池。您可以在自動釋放池的Memory Management Programming Guide部分閱讀有關內存管理的更多信息。

0

無論如何,你需要返回一個自動釋放對象,所以對結果字符串沒有什麼應該做的。我沒有看到任何與內存有關的錯誤,但是你的代碼肯定比需要的更冗長。請記住,在Objective-C,如果你調用一個方法上的零,你回來零(或0的整數,但浮點值)。你可以取出所有這些if語句和兩個返回路徑,並且你的代碼仍然以相同的方式工作。另外,我只會使用alloc而不是allocWithZone。

+0

你可以說'爲什麼'你不會使用allocWithZone? – Rob 2009-01-09 20:11:39

0

我不是這個100%。我也只是在學習Mac/Iphone開發。但是您可以使用自動發佈池來幫助進行內存管理。它用於解決發佈問題。

這是一篇有關memory management的文章。查看左側菜單。