2011-02-27 85 views
0

我有Util類,如下所示。Objective-C對象的分配/釋放

@implementation Util 

- (NSString*) getTodayString 
{ 

    NSDate *today = [NSDate date]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     // display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings 
    [dateFormatter setDateFormat:@"YYYY/MM/dd"]; 
    NSString *now = [dateFormatter stringFromDate:today]; 

    [dateFormatter release]; ///??? 
    [today release]; //??? 
    return now; 
} 

@end 

而且我用

- (void)awakeFromNib 
{ 
    Util *ut = [[Util alloc] init]; 
    NSString* now = [ut getTodayString]; 
    NSLog(@"User's current time in their preference format:%@",now); 

    [currentTime setObjectValue:now]; 
    [now release]; ///??? 
    [ut release]; 
} 

我釋放對象時感到困惑的類。

在getTodayString ::

Q1。 [dataFormatter版本]是必要的? Q2。 [今天發佈]是必要的?

我想我不需要釋放他們,因爲我沒有撥出自己。如果這是真的,那麼這些物體何時被釋放?

In awakeFromNib ::

Q3。 [ut釋放]是必要的? Q4。 [現在發佈]是必要的?

我想我必須發佈ut作爲我明確創建對象,但不是關於now對象的suer。

  • 如何確定對象何時被釋放?
  • 用python/C#/ Java不再關心這種類型的內存釋放。如果我不關心它們,Objective-C也可以嗎?

回答

4

Q1。 [dataFormatter發佈]是否需要 ? Q2。 [今日發佈]是否需要 ?

dataFormatter:是的,你分配/ init'd它。
今天:不,它從工廠方法返回autoreleased。

Q3。 [ut釋放]是必要的? Q4。 [現在發佈]是必要的嗎?

同樣,

UT:是的,你分配/ init'd它。
now:不,它從工廠方法返回自動釋放。

如何確定 對象何時被釋放?

它時release被稱爲上公佈,如果autorelease被調用,release將自動釋放池在下次運行時被調用。

Objective-C還可以,如果我 不關心它們嗎?

不,它不好。如果你自己沒有清理完畢,你將會發生嚴重的內存泄漏,在iOS環境中意味着應用程序完全關閉。在一個Mac應用程序,可以導致吃了一噸的記憶,而不是一個好公民。這是假設一個非垃圾收集環境。即最。

我猜你的問題的核心是你不確定何時負責調用release以及何時得到autoreleased對象(或者說,當你負責調用對象的釋放時)。這是慣例。如果你調用任何方法返回的對象不包含包含的話:init/copy然後它是不是你的責任來調用發佈。如果你保留,你會發布(可能有更多的規則可以遵循,但這是第一個真正開始理解這一點的人,在我看來)。如果你曾經調用alloc/init/copy,那麼你必須在某個時候調用release

偉大的老師是Build &分析在Xcode。這會很快指出你搞砸的地方,並且真正幫助你理解正在發生的事情。

+0

避免對從類方法自動發佈的對象進行假設。總是考慮對象所有權,即「我是否擁有這個對象?我是否從名稱中帶有'new','copy'或'alloc'的方法得到它?」 – dreamlax 2011-02-27 23:56:53

+0

好點,澄清了我在這方面的發言。 – MarkPowell 2011-02-28 00:21:00

1

您是否關心objective-c中的內存管理取決於您所使用的環境。如果您正在使用垃圾回收,您不必擔心它,但默認情況下,垃圾回收未在Mac上啓用,並且在iOS上根本不可用。因爲當有什麼需要的基本規則被釋放:

  • 如果從開始得到它與ALLOC或init,或包含單詞副本的方法,那麼你擁有它,必須將其釋放。
  • 如果您明確保留一個對象,則您擁有它並且必須釋放它。
  • 如果該方法不包含alloc,init或copy,則可以假定它已被自動釋放。它將在未來的某個時刻自動發佈,如果您想在當前方法返回後使用它,則需要保留它。

當然,這些也取決於任何第三方代碼遵循這些規則,當他們autorelease返回的對象。

+1

'init'不影響對象的保留計數,只有'alloc'。否則,你需要釋放它兩次。 – dreamlax 2011-02-27 23:57:34

+0

@dreamlax不,但它表明您擁有該物體。 – ughoavgfhw 2011-02-28 05:31:44

1

memory management rules簡單明瞭。不要認爲就保留數量而言,總是考慮所有權。當你問自己問題「應該釋放這個對象嗎? 」,問問自己「我是否擁有它? 」。將規則提交給記憶,最終他們將成爲第二天性。

遵守規則是非常重要的。如果你忽略它們,那麼你不擁有的對象可能會在你完成它們之前解除分配(比如分配不屬於實例變量的對象,它們可能會在自動釋放池被耗盡後解除分配)。另外,如果你忽略它們,你將最終導致可怕的內存泄漏。