2012-05-07 128 views
2

我所做的是內存管理目標C,NSString的

int main(int argc, char *argv[]){ 
    NSString *str = [[NSString alloc] init]; 
    str = @"a a a a a a a a a "; 
    [str release]; 
    NSLog(@"string is %@",str); 
    return 0; 
} 

我認爲字符串將是零,因爲我們可以在打印前將其釋放。但事實並非如此。所以,我的消費是錯誤的。

任何人都可以指導我並糾正我。任何意見都歡迎。謝謝

+0

考慮使用ARC,它支持iOS 4.x及更高版本。 iOS 4.x中只有弱參考快照缺失。 – zaph

回答

2
NSString *str = [[NSString alloc] init]; 

聲明一個變量,它是一個指向NSString一個實例,分配內存的NSString一個實例,初始化內存,然後分配一個指向內存給你聲明的變量。

str = @"a a a a a a a a a "; 

這將創建一個NSString常數和指針分配給它,你聲明的變量。由於您不再參考您創建的原始NSString對象,因此泄漏了爲其分配的內存。

[str release]; 

這聲明此代碼不再希望成爲分配給str的內存的所有者。當你用字符串文字創建它時,這個對象將永遠存在於你的程序中,並且釋放它什麼也不做。

我認爲字符串將是零,因爲我們在打印之前先釋放它。

發佈對象從未將其設置爲nil

+0

這是什麼意思,當我做** NSString * str **只有 – tranvutuan

+1

只有代碼會聲明一個指針,但它不會指向任何'NSString'對象,因爲您尚未爲其分配或初始化任何內存。 – Jim

1

字符串常量不會被釋放;他們既沒有明確地被釋放也沒有自動釋放;它們只是常量(順便說一下,它們在範圍結束時被釋放)。

因此,只有-release他們,如果你以前保留他們

3

你有內存泄漏,首先你分配一個新的,空的,NSString對象,然後你分配一個靜態字符串字面量指針,有效泄漏你以前分配的內存。然後你釋放一個你不屬於Saaad指出的對象,然後你應該注意到釋放不會將指針設置爲零,而只是釋放可能或可能不會以釋放結束的對象(它,假設它將釋放對象,也不會將指針設回nil)。

2

str變量是一個指向字符串對象的指針,基本上包含一個內存地址。向對象發送如retain的消息不會更改變量的值。

只是因爲字符串被釋放不會導致變量失去其價值。您必須明確地將變量設置爲零才能發生。

請注意,對於iOS 5下的ARC,您可以獲得弱引用/指針,當它們的基礎對象被釋放時它們將變爲零。您通過在__weak關鍵字前添加變量聲明(或在屬性聲明中使用weak)來完成此操作。

0

這裏是糾正來源:

恐怕有很多之前充分了解正在發生的事情來學習。您還應該瞭解malloc(儘管不要使用它),以及指針如何在C中工作。

int main(int argc, char *argv[]){ 
    NSString *str = [[NSString alloc] initWithString:@"a a a a a a a a a "]; 
    [str release]; 
    str = nil; 
    NSLog(@"string is %@",str); 
    return 0; 
} 


int main(int argc, char *argv[]){ 
    NSString *str = @"a a a a a a a a a "; 
    // DONT Call this - the str [str release]; - no need to release this kind of string 
    NSLog(@"string is %@",str); 
    return 0; 
}