簡體   English   中英

需要在iPhone內存管理中進行說明

[英]Need clarification in iPhone memory management

我在iPhone內存管理方面幾乎無需澄清。

這是setter的一個例子;
1)。

-(void)setValue:(NSString*)input{
[value autorelease];
value = [input retain];
}

在這個例子中,為什么我們必須使用autorelease? 我們可以使用如下嗎?


if(value)
[value release];
value = [input retain];

在第一個例子中,為什么我們不應該釋放內存以進行input
2)。 如果我使用以下聲明; 什么是value的保留計數

NSString *value;
value = @"welcome";

在上面的陳述之后,我正試圖再設置一個值。 然后會發生什么?

eg:
value = @"For testing";

3)。 2)和3)有什么不同?

NSString *value;
value = [input1 retain];
...
...
value = [input2 retain];// Now what is the retain count for value

4)。 如果我使用以下聲明,為什么應用程序崩潰?


NSString *value = [[[NSString alloc] init] autorelease];
...
...

提前致謝..

如果“input”與“value”完全相同,則調用[value release]可以釋放該對象。 因此,您必須保留新的輸入值,釋放舊值,然后將新值分配給ivar:

[input retain];
[value release];
value = input;

在2)和3)中的每一個之后,NSString *值指向文字NSString對象,每種情況下保留計數將為1,並且釋放它可能不是一個好主意

在這段代碼之后:

value = [input2 retain];

value是input2對象的別名。 要實現的是對象有保留計數, 變量沒有。

至於你的最后一個案例,

NSString *value = [[[NSString alloc] init] autorelease];

它會創建一個自動釋放的空字符串。 如果在自動釋放實際發生后再次引用該對象,則可能會發生崩潰,因為您將引用一個不再存在的對象。

如果在保留新值之前釋放值,那么如果將相同的值設置兩次,則可能會出現問題。 如果調用者沒有保留自己的副本,例如當他們從他們嘗試設置它的同一個對象獲取值時會發生這種情況,如下所示:

object.value = object.value;

該語句將導致該對象在再次保留之前被釋放,這可能導致內存被釋放並導致保留懸空指針。 通過執行自動釋放,可以確保將相同的指針復制到自身上可以正常工作。

1)由於以下原因,您將不得不進行自動釋放:當輸入與值相同的對象時,您將釋放值,它的保留計數將達到零並在您通過輸入再次保留之前取消分配。 您可以使用retain來執行此操作,但您必須更改代碼:

-(void)setValue:(NSString*)input{
   if (value != input) {
      [value autorelease];
      value = [input retain];
   }
}

2)我相信@“Text”將被視為常量。 當您需要一個不需要任何內存管理的對象時:

NSString *value = [NSString stringWithString:@"Text"];

這將返回一個自動釋放的對象。

3)在這個例子中,它不是關於值的保留計數,而是關於引用值1的兩個對象的保留計數。 當你不離開該方法之前釋放輸入1,你將有一個內存管理問題。

4)此聲明應該有效。 沒有必要爭論。 你寧願使用[NSString string]。

注:內存管理:當您使用的alloc新的復制的 ,你還必須在同一范圍內使用釋放自動釋放同一個對象上。

我經常寫我的二傳手

- (void)setValue:(NString *)input {
    if (value != input) {
        [value release];
        value = [input retain];
    }
}

這避免了輸入和值都是同一個對象的問題。 如果你只是在沒有檢查的情況下釋放它,那么你可以完全釋放它,下一行將嘗試保留一個不再存在的對象。


但是,最好的做法是復制字符串而不是保留它們:)

(假設你在非gc環境中工作)

1)您可以創建一個臨時變量,並在保留/分配后釋放溫度。 否則,你需要比較指針。 延期發布也可能掩蓋線程錯誤(無論你認為好壞都是......)

2)從技術上講,NSString文字對程序的生命周期有效。 那就是: while (1) [@"why won't i die?" release]; while (1) [@"why won't i die?" release]; 產生無限循環。

3)使用顯式retain,alloc + init,new和copy,您必須使用release或autorelease來抵消保留計數。 因為你沒有釋放value1,靜態分析可能(正確地)發現它是泄漏。 因為字符串常量永遠不會死,所以這兩者在這方面無法比較。

4)這個問題沒有錯。 問題出在你的程序的其他地方。 要么將其分配給ivar而不保留,要么稍后將其釋放。

經常嘗試使用靜態分析,並嘗試減少使用自動釋放的程度(你不能完全避免它)。

這些都不是魔術,但你可以通過不使用自動釋放來至少減少許多問題的位置(或非常接近)。 盡可能使用手動保留/釋放。

最后,檢查泄漏並啟用NSZombies。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM