0

有一件事我不明白關於ARC:我們應該如何處理使用[... copy]創建的局部變量?如果我使用(copy)標誌創建一個屬性,ARC將自動處理這個問題,但據我所知,變量沒有__copy標誌。是否允許使用ARC在ObjC中調用[obj copy]?

@interface Foo : NSString 
@end 

@implementation Foo 

- (void) dealloc { 
    NSLog(@"%p deallocated", self); 
} 

- (NSUInteger) length { 
    return 1; 
} 

- (unichar) characterAtIndex: (NSUInteger) i { 
    return 'x'; 
} 

@end 

- (void) foo { 
    Foo *f = [[Foo alloc] init]; 
    NSLog(@"%p", f); 

    Foo *f2 = [f copy]; 
    NSLog(@"%p", f2); 
} 

我得到的是::

我曾與這樣的代碼測試這個

0x102406530 
0x102015f10 
0x102406530 deallocated 

我從來沒有得到「0x102015f10解除分配」,這將表明複製的變量沒有得到釋放。它甚至不會自動發佈,因爲當我做出另一種返回自動釋放對象的方法[Foo foo]時,我在一會兒之後就收到了「釋放」消息。

那麼有沒有什麼辦法可以讓它在沒有轉換成屬性的情況下被釋放?

+4

如果你打算做這個實驗,那麼你最好在一個完全理解內存管理的類上工作。 'NSString'有誰知道什麼是內存優化,所以它不給你一個很好的基礎。 'NSString'也是類集羣的一部分,並且繼承並不像你所做的那樣簡單,還有更多需要跳過的環節。 –

+0

@ Paul.s所以你是英國人,對吧?我不知道存在'你'。這是什麼構造? – 2012-11-03 23:08:57

回答

1

好吧,我的壞 - ARC實際上正確處理複製的對象。由於使用NSString進行測試,我得到了錯誤的結果,因爲我想使用已經實現了複製的類而不是明確地實現它;當我重複對從NSObject繼承的類進行測試並通過返回[[Foo alloc] init]來實現copyWithZone:時,我得到了兩個「解除分配」消息。感謝@ Paul.s指出了這一點。

+0

我猜在ARC下,'copy'返回一個引用計數爲1的對象,那麼當你將它分配給一個強引用時,如果編譯器注意到該對象是通過複製另一個引用而創建的,則不會再保留它。 – 2012-11-03 23:07:37

+0

此外,爲什麼這會得到downvoted? – 2012-11-03 23:07:57

+1

實際上,ARC會正確處理複製的對象。你可以繼承NSString,但是文檔指出你必須重寫的方法,其中包括'NSCopying'的實現 – Abizern

相關問題