編寫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)中釋放
tmpAttributedString
,只有一個NSAttributedString
指針而沒有像(2)中的臨時NSString
?可能嗎? (第二個init
取決於第一個init
。)編譯器在場景(1)中會做些什麼?我的意思是ARC如何爲它插入release/autorelease? (1)中是否有任何內存泄漏? (當然,用ARC去掉
release
的明確呼叫。)
謝謝!
如果有任何客觀的C對象,alloc和init只會被調用一次? – dreamBegin
@dreamBegin只是爲了確保。你的意思是我不應該重用NSAttributedString指針,並且應該創建一個新指針? –
你不應該只是設置初始化的第一個NSAttributedString的所有屬性?沒有必要製作第二個NSAttributedString。 –