2016-12-15 100 views
0

編寫Objective-C時,即使在ARC的幫助下,知道如何管理內存也很重要。如何釋放初始化對象

下面是一個代碼段(非ARC):

(1)

NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}]; 
// how should I release tmpAttributedString here? 
tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpAttributedString.string attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}]; 
[tmpAttributedString release]; 

這是我目前做,以避免存儲器泄漏:

(2)

NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}]; 
NSString *tmpString = tmpAttrbutedString.string; 
[tmpAttrbutedString release]; 

tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpString attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}]; 
[tmpAttributedString release]; 

我的問題是:

  1. 我該如何在(1)中釋放tmpAttributedString,只有一個NSAttributedString指針而沒有像(2)中的臨時NSString?可能嗎? (第二個init取決於第一個init。)

  2. 編譯器在場景(1)中會做些什麼?我的意思是ARC如何爲它插入release/autorelease? (1)中是否有任何內存泄漏? (當然,用ARC去掉release的明確呼叫。)

謝謝!

+0

如果有任何客觀的C對象,alloc和init只會被調用一次? – dreamBegin

+0

@dreamBegin只是爲了確保。你的意思是我不應該重用NSAttributedString指針,並且應該創建一個新指針? –

+0

你不應該只是設置初始化的第一個NSAttributedString的所有屬性?沒有必要製作第二個NSAttributedString。 –

回答

0

ARC的規則相對簡單。如果您撥打alloc,newcopy,則ARC理解,當該對象超出範圍時,需要調用release。所有其他對象都假定爲autoreleased。 「超出範圍」意味着要麼返回或重新分配變量。在它看到一個變量的重新分配的情況下,它將在它被分配給其他事物之前暗中放入一個release調用。如果你返回一個變量,ARC會對該變量進行autorelease調用,以便它可以超出該方法的範圍;沒有被返回但仍然存在的任何其他現有變量(不是自動釋放的)將會有隱含的release發送給它們。

Apple's official transition guide僅供參考。