2012-07-07 38 views
0

我看到了下面這段代碼我是否必須在iOS編程中使用內存管理版本?

UIAlertView *alert = 
    [[UIAlertView alloc] initWithTitle :@」Hello World!」 
            message:@」iPhone, here I come!」 
            delegate :self 
         cancelButtonTitle:@」OK」 
         otherButtonTitles:nil ]; 
    [alert show]; 
    [alert release]; 

我是否需要呼叫釋放每一次,或者是有沒有辦法在Java或.NET自動管理存儲像垃圾回收?

回答

3

你可以使用ARC(自動引用計數),它不是垃圾收集,但是有種編譯器功能可以讓開發人員不用擔心內存管理。

看看這個questionlink

總之ARC就像手冊引用計數(MRC)與編譯器搞清楚何時調用保留/釋放。

您還可以轉換任何非ARC項目以使用XCode中的ARC(編輯 - >重構 - >轉換爲Objective-C ARC)。您還可以選擇性地將項目/文件設置爲不使用ARC(例如第三方代碼)。

+2

使用ARC和非ARC代碼「完成分配的對象並跨越邊界」是完全正確的。這是ARC的一大賣點。您必須遵守有關方法名稱的內存管理約定,以確保ARC和非ARC代碼同意如何處理事情。 – 2012-07-07 14:11:31

+0

謝謝你,我編輯了我的答案。我不知道在發表評論時我的想法是什麼(可能是我的C++ exp)。但非常感謝你指出。 1 up – msk 2012-07-07 15:05:15

1

Java.NET是垃圾收集的平臺,它們運行在自己的虛擬環境中。 Objective-C構建於C之上,內存管理由開發人員處理。蘋果推出了一種叫做Automatic Reference CountingARC)的東西,它負責釋放沒有指向它們的對象,但無論如何ARC不像垃圾收集。因此,您需要閱讀內存管理規則以及/或者如何正確使用ARC ...

+1

+1您可以添加從iOS 5開始可用的ARC,並且低級編程仍然需要使用保留/釋放。 – moxy 2012-07-07 11:51:25

0

其他答案肯定是正確的。如果您確實需要進行手動內存管理:您只需要釋放名稱以「alloc」,「copy」,「new」或「mutableCopy」開頭的消息所獲得的對象。從消息返回的所有其他對象不屬於您,不需要發佈。他們中的大多數都被添加到自動釋放池中。您還應該遵循該約定並始終返回自動發佈的對象(關於上述例外情況)。

編輯:哦,還有一件事:由於這種自動釋放行爲,您需要保留要保留的對象,方法是將它們分配給您的類的保留屬性或使用[retain]手動執行。遵循和記住這三條規則可以讓你順利地得到。

+0

首先,您忘記了「mutableCopy」。其次,你從方法中得到的東西並不一定是自動釋放的。只是你不擁有它們。他們可能會或可能不會被自動釋放。關鍵是,這不是你關心的問題。其他內容負責內存管理。當然,你是對的,如果你想要堅持下去,你必須確保你擁有它。如果它不是來自給你所有權的方法,你必須保留它。 – 2012-07-07 14:15:22

+0

好吧,我編輯過它。 – 2012-07-07 14:45:41

相關問題