2011-05-23 124 views
4

正如我在許多例子中看到的那樣,首先爲臨時對象分配內存,然後將同一對象分配給自己。例如,我有一個代碼片段在這裏:爲什麼我們需要一個臨時對象?

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    Movie *newMovie = [[[Movie alloc] initWithTitle:@"Iron Man" 
            boxOfficeGross:[NSNumber numberWithFloat:650000000.00] 
              summary:@"Smart guy makes cool armor"] autorelease]; 
    self.movie = newMovie; 
} 

爲什麼不能,我們執行這樣的:

self.movie =[[[Movie alloc] initWithTitle:@"Iron Man" 
          boxOfficeGross:[NSNumber numberWithFloat:650000000.00] 
            summary:@"Smart guy makes cool armor"] autorelease]; 
+2

據我所知,兩者完全相同。不過,我可能是錯的。 – 2011-05-23 08:35:37

+0

看起來像兩個意思是一樣..無論如何感謝您的迴應 – 2011-05-23 08:55:59

回答

3

兩者基本相同。他們堅持所有權條款 - 您釋放創建/保留的內容。雖然這裏不是很明顯,但它的差異在於釋放自動釋放對象所花費的時間。比方說,如果這些自動釋放對象的負載在內存中徘徊,這可能會產生內存問題。如果我們釋放它們並且它們的保留計數爲零,它們將立即釋放並釋放內存。

+0

我didn知道那!我只是認爲使用AutoRelease更好,內存自動釋放 – 2011-05-23 08:56:58

+0

@KPK不使用autorelease池是過早優化。如果內存是一個問題,那麼你也可能需要解除分配框架返回的自動釋放對象,並且你不能簡單地將它們發送給「-release」。 – 2011-05-23 09:04:17

+0

儘可能避免自動釋放,如果你知道你的變量的作用域儘可能高效,並且當你知道你已經完成了它們時就進行分配和釋放。我看到太多的開發人員使用autorelease池來使他們的生活變得更簡單,但是如果您在單個運行循環中執行大量的分配,那麼這只是懶惰並且可能導致大量的內存佔用。 – 2011-05-23 10:10:54

2

你不需要的臨時對象。你的建議完全有效。

0

但是,如果你需要設置屬性或創建對象,使用臨時對象後調用方法可能比調用self.movie多次更好一點:

Movie *newMovie = [[[Movie alloc] initWithTitle:@"Iron Man" boxOfficeGross:[NSNumber numberWithFloat:650000000.00] summary:@"Smart guy makes cool armor" ] autorelease]; 
newMovie.rating = 4; 
[newMovie fetchImageFromServer]; 
self.movie = newMovie; 

就個人而言,我不使用autorelease在這種情況,但這更多的是一種風格偏好:

Movie *newMovie = [[Movie alloc] initWithTitle:@"Iron Man" boxOfficeGross:[NSNumber numberWithFloat:650000000.00] summary:@"Smart guy makes cool armor" ]; 
newMovie.rating = 4; 
[newMovie fetchImageFromServer]; 
self.movie = newMovie; 
[newMovie release]; 
相關問題