簡體   English   中英

[[NSDate date] retain]和[[NSDate alloc] init]之間的區別

[英]Difference between [[NSDate date] retain] and [[NSDate alloc] init]

由於以下兩個用途相同,

today = [[NSDate date] retain];    

today = [[NSDate alloc] init]; 

那么它們之間的區別是什么?
這里有什么與內存分配方法有關或其他東西是相應使用它們的原因。

[NSDate date]是一個方便的構造函數,您可以使用它來解釋將對象釋放到自動釋放池。 retain消息發送到方便構造函數(如[[NSDate date] retain]會使您成為對象的所有者,並且您有責任正確地釋放它。

[[NSDate alloc] init]是您成為對象所有者的默認初始值設定項, 幾乎等於 [[NSDate date] retain]

除了前者不必要地將對象放入自動釋放池之外,基本上沒有區別。

如果我想在創建對象后保留該對象,並且該類可以使用-init樣式方法,我幾乎總是選擇方便構造函數加-retain

兩者之間實際上沒有區別。 在第一個例子中,你只是保留了一個由easy方法創建的自動釋放的實例,它會做類似return [[[NSDate alloc] init] autorelease]事情。

當你這樣做:

[NSDate date];

...創建一個新的NSDate,它將在事件循環結束時自動釋放(不釋放!)。 當然,你可以保留它以保持更長時間。

當你這樣做:

[[NSDate alloc] init];

...創建一個新的NSDate,您應該在完成后釋放它。

從內存管理的角度來看, [[NSDate date] retain]和替代方案之間的主要區別是這個NSDate將至少在事件循環結束之前。 如果你只是創建一些對象,那沒關系。 但是,如果您創建(並釋放) 許多對象 - 比如,在循環中處理數據時 - 使用前一種模式可能會導致應用程序的內存使用量出現峰值(然后在事件循環結束時突然掉落) 。 使用后一種模式,一旦釋放它,對象就會被破壞。

大多數情況下,當一個類有一個自動釋放的初始化程序時 - 它看起來像這樣:

return [[[NSDate alloc] init] autorelease];

所以當你調用[[NSDate date] retain]; ,你有效地打電話

[[[[NSDate alloc] init] autorelease] retain];

如果你問我,這是毫無意義的 - 我只是堅持[[NSDate alloc] init]; 用於初始化對象。

方便的方法就在那里,所以你可以快速獲得一個自動釋放的對象 - 不要與retain一起使用。 它會做同樣的事情,但我想說如果你想要一個保留的對象,最好只調用標准初始化器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM