2013-11-27 125 views
0

所以,我想知道這兩段代碼之間的區別是什麼 - 除了語法差異?這兩段代碼有什麼區別?

BBDataStore* tempDataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
    self.dataStore = tempDataStore; 

self.dataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 

Self.dataStoreBBDataStore一個屬性。

從我所看到的 - 這裏沒有區別。

在第一個示例中 - 我們最終將tempDataStore分配到self.dataStore - 這是BBDatastore的一個實例。

在第二個例子 - 我們有效地做同樣的事情...不是這樣嗎?

+1

我認爲兩條線都沒有不同。 –

+0

在第一種情況下,第一行創建對象,tempDataStore引用它,當第二行執行時,self.dataStore也指向同一個對象。因此引用計數會增加。當tempDataStore作用域將結束時,將只有一個對象引用,它將是self.dataStore。在第二種情況下,只有一個指向對象的指針,那就是self.datastore –

+1

沒有有效的區別。如果使用優化編譯器進行編譯,則兩者可能會生成相同的代碼。 (一個調試模式的編譯器會有所不同,因爲命名變量必須被調試器訪問,因此可能不會進行寄存器優化。) –

回答

2
BBDataStore* tempDataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
self.dataStore = tempDataStore; 

這是將BBDataStore的實例保存到tempDataStore中。而你正在將tempDataStore分配給其他對象,比如self.dataStore。

self.dataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 

這是self.dataStore的直接初始化。

區別僅在於第一種方式多了一個變量進入圖片也消耗內存位。爲什麼我們應該消耗記憶,即使我們有便利的方法來啓動。所以你應該避免第一種方式,並採取第二種方法,這是非常一般和適當的。

+0

謝謝 - 這對我很好。我更喜歡第二個。由於我使用ARC - 管理引用計數是爲我完成的,沒有任何需要擔心的問題? (在基本的內存管理方面) – Tander

+1

是的,你不需要擔心它。但你應該注意不要爲臨時任務添加佔位符/垃圾變量嗎? :)。在所有情況下,都要採取第二種方法。 –

+0

太好了 - 謝謝,我會這麼做的! :) – Tander

0

在第一種情況下,第一行創建一個對象並且tempDataStore引用它,當第二行執行時,self.dataStore也指向同一個對象。因此引用計數會增加,兩個指針將指向同一個對象。而當tempDataStore範圍將結束時,將只有一個對象的引用,那將是self.dataStore。在第二種情況下,只有一個指向對象的指針,那就是self.datastore

1

如果你在你的代碼中使用ARC,那麼這兩個語句的效果都是一樣的(編譯器會發生奇蹟,確保兩個語句的結果相同)。

如果有self.dataStore這是手動內存管理聲明爲retain屬性然後,

代碼1:將是該retain屬性與對象分配理想的方式。這將保持創建的對象的引用計數爲1(您的財產將是所有者)。所以當retain財產的伊娃在dealloc被釋放時,內存被清除。

BBDataStore* tempDataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
self.dataStore = tempDataStore; 
//This will ensure memory does not leak, reference count will get reduced by 1 
[tempDataStore release]; 

代碼2:將具有所述對象的引用計數爲2(一個從init和從retain屬性其他)。即使在dealloc中釋放伊娃後,由於臨時對象引用不可用於調用release方法,因此此代碼可能會泄漏內存。

//This created object will have reference count 2 
self.dataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
//reference to temporary object is not available hence cannot call release 

因此,在這種情況下,對於ARC機制,編譯器會插入某些代碼行,以確保您的對象的內存不漏(這將分配後此創建一個臨時參考物件,將發佈聲明屬性,類似於code1)。

希望有幫助!