2012-08-14 44 views
0

我有以下功能,導致*timeString泄漏內存。我對Objective-C(和內存管理)相當陌生,但是我讀到你只需要release對象,你首先需要的是alloc。因爲我alloc*formatter,然後將其設置爲*timeString,這是否意味着我現在還必須發佈*timeString呢?內存泄漏從我沒有分配的對象

下面的代碼:

-(NSString *)getDate{ 

    NSLog(@"getDate"); 

    NSDateFormatter *formatter; 
    NSString *timeString; 

    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd"]; 

    timeString = [formatter stringFromDate:[NSDate date]]; 

    [formatter release]; 

    return timeString; 
} 

編輯:這裏就是getDate函數被調用:

瞭解泄漏
-(NSString *)getFileName{ 

    //nameofXMLFile = page_## 
    NSString *nameOfFile = [NSString stringWithString:pageTitle]; 

    //nameOfXMLFile = page_##.DataCheckSheet.xml 
    nameOfFile = [nameOfFile stringByAppendingString: @".DataCheckSheet.xml"]; 

    NSString *dateString = [self getDate]; 
    dateString = [dateString stringByAppendingString: @"_"]; 

    NSLog(@"datestring: %@", dateString); 

    dateString = [dateString stringByAppendingString:nameOfFile]; 

    NSLog(@"datestring with append: %@", dateString); 

    //nameOfXMLFile = yyyy-MM-dd_page_##.DataCheckSheet.xml 
    nameOfFile = dateString; 

    return nameOfFile; 
} 
+1

不,你有這個權利...你不應該釋放timeString ...但是,請允許我問:你在用那個TimeString做什麼?我的意思是,你回來了,這意味着你可能在某處使用它。你確定,沿途沒有保留物? – ATaylor 2012-08-14 16:47:24

+0

它返回到另一個函數,然後附加到其他一些字符串。我將編輯該代碼到問題中,以便您看一看。 – BloonsTowerDefence 2012-08-14 16:49:34

+0

還想到什麼:你不使用線程,對吧?因爲如果你這樣做了,你需要爲它創建一個單獨的AutoReleasePool。 – ATaylor 2012-08-14 16:50:48

回答

0

最好的辦法是使用儀器和它的「泄漏「模板。

「泄漏」工具將顯示哪些對象泄漏,您將能夠立即跳到ObjectAlloc工具以查看對泄漏對象的保留/釋放調用。然後您應該能夠找到丟失版本的位置。

因爲,您的代碼看起來好像是內存管理。然而,這裏創建的大多數字符串都是自動釋放的,這意味着當外部自動釋放池被耗盡時它們將被有效釋放。在游泳池排水之前,您的物體可能會泄漏。

在典型應用中,主線程具有通過的NSApplication/UIApplication的自動安裝一個自動釋放池,但是當應用程序接收的事件(見this question

在通常的分離的線程(使用NSThread或游泳池僅排出pthread),你必須安裝你自己的池(並且定期排出它們)。

GCD調度隊列安裝他們自己的autorelease池並且不時地排空它們。

1

正如您已經正確說明的那樣,所有未明確分配的對象都是定義爲'autoreleased',這意味着一旦它們離開定義它們的函數範圍,它們就會被銷燬。

要保持一個對象的有效性比這個更長,例如,通過將其作爲類對象保留,您可以對其調用'retain'。 這個'保留'需要'發佈',就像'被隔離'的對象一樣。

將對象的引用作爲返回值傳遞給函數,該函數首先調用該函數...這意味着該對象將在最後被銷燬的調用函數,除非它被保留。

nameOfFile仍然是那個非常有問題的對象,因爲您將dateString的地址複製到該變量,從而有效地從存在中清除該字符串(因此它會自動釋放)。 儘量避免這樣的分配,除非你有他們的理由,以避免混淆。

簡而言之:如果你有一個函數調用和返回鏈,確保沒有'保留'在沿線的某個地方,這不會得到適當的釋放,你會沒事的。