2012-04-02 52 views
2

我有一個創建一個字符串,然後一個方法追加其他字符串到它:的Objective-C的NSString的malloc錯誤

-(NSString*)returnDetails { 
    NSString *details = [[NSString alloc] init]; 

    details = [details stringByAppendingString:url]; 
    details = [details stringByAppendingString:@" : "]; 
    details = [details stringByAppendingString:author]; 

    return [details autorelease]; 
} 

而且我得到這個錯誤:

iphoneapp_1(66508,0xacd9e2c0) malloc: *** error for object 0x6b9eb80: pointer being freed was not allocated

如果我將其更改爲

NSString *details = [NSString string]; 

,並刪除自動釋放呼叫,然後它的作品。我只想了解爲什麼這會起作用,而我原來的方法沒有?

回答

3

NSString的方法stringByAppendingString:返回已經自動釋放的對象。因此,從您的方法返回[details autorelease]將使該對象將被釋放一次比它必須。改爲返回details

您也有內存泄漏,因爲您從未釋放您在該方法頂部分配的字符串。試試這個代碼:

-(NSString*)returnDetails { 
    NSString *details = [NSString string]; 
    details = [details stringByAppendingString:url]; 
    details = [details stringByAppendingString:@" : "]; 
    details = [details stringByAppendingString:author]; 

    return details; 

}

+0

感謝隊友,我現在明白了:) – harrynorthover 2012-04-02 10:22:23

3

當你調用

details = [details stringByAppendingString:NSString*]; 

您創建已標記爲自動釋放一個新的對象。爲了達到你想要什麼,你可以簡單地做:

-(NSString*)returnDetails { 
    NSMutableString *details = [[NSMutableString alloc] init]; 

    [details appendString:url]; 
    [details appendString:@" : "]; 
    [details appendString:author]; 

    return [details autorelease]; 
} 
1

stringByAppendingString:給你,你沒有自己的字符串。您不得釋放或自動釋放它。

您的原始空字符串泄漏的方式。你可以只使用:你被分配和初始化的NSString對象的

NSString *details = @""; 

details = [details stringByAppendingString:url]; 
details = [details stringByAppendingString:@" : "]; 
details = [details stringByAppendingString:author]; 

return details. 

NSString details = [NSString stringWithFormat: @"%@ : %@", url, author]; 
return details; 
1

首爾後重寫地址(MEM泄漏)。

NSString *details = [[NSString alloc] init]; 

後來通過調用stringByAppendingString,你已經獲得了「autoreleased」對象。顯式自動釋放不是多餘的。這是雙發行版。

1
//This line 

    NSString *details = [[NSString alloc] init]; 
    // In this you are allocating memory for the NSSTring object detail. 

    in the very next lines: 

    details = [details stringByAppendingString:url]; 
    details = [details stringByAppendingString:@" : "]; 
    details = [details stringByAppendingString:author]; 

    // Here you are making same object as autoreleased. That means you have make this instance free to release. 

    Now in next line: 

    return [details autorelease]; 

    // here you are autoreleasing the object which was already autoreleased. So it got crashed. 

你做的是什麼@delannoyk用戶已告知:

{ 
NSMutableString *details = [[NSMutableString alloc] init]; 

    [details appendString:url]; 
    [details appendString:@" : "]; 
    [details appendString:author]; 

    return [details autorelease]; 
}