2011-03-08 87 views

回答

4

是的,有區別。第一隻分配值的變量,而另一個被分配給一個屬性,因此,寫作是一樣的:如果你定義了你的財產爲@property(retain) NSDate *date;默認實現

[self setDate:[NSDate dateWithTimeIntervalSinceNow:0]]; 

例如,(通過@synthesize date)將釋放舊值並保留新值。您還可以提供自定義setDate:實現,並在日期分配時執行一些操作。如果您只將值賦給變量,所有這些都不會發生。

+0

這是否意味着,如果我做日期= [NSDate dateWithTimeIntervalSinceNow:0];日期將自動發佈,並且當我嘗試在稍後階段訪問此變量時,我可能會得到EXC_BAD_ACCESS? – Ladislav 2011-03-08 12:29:11

+1

準確(如果您稍後未明確保留)。或者有時你沒有得到EXC_BAD_ACCESS,但是其他一些對象是在同一個位置創建的,因此你會得到有趣的結果。 – DarkDust 2011-03-08 12:38:37

+0

這就是發生了什麼...因爲有時候我會得到EXC_BAD_ACCESS,其他時候我不會... Thanx – Ladislav 2011-03-08 12:40:52

1

通過聲明self.date =一定的價值;你實際上在做以下事情

if(date)[date release]; date = [somevalue retain];

+1

。 – 2011-03-08 09:15:24

+0

另外,如果按照您編寫的順序執行,那麼如果您重新分配與釋放相同的值,可能會導致引用計數器降至0並因此取消分配對象,將會發生不利情況。正確的順序是首先保留新值,然後釋放舊值,然後將新值賦給變量。 – DarkDust 2011-03-08 09:18:45

4

是的。 self.date調用名爲date的屬性的setter,並且如果您在屬性規範中給出了類似retain的內容,或者如果您提供了自己的訪問器,它們將被調用。

除非您絕對確定,否則在大多數情況下使用self.date總是比較好。還要注意,目前的編譯器允許您只是對一個屬性進行代理併合成,而無需使用自己的變量聲明。它優於顯式變量聲明。如果您使用該構造,則無論何時直接使用該變量而不使用訪問器,都會收到編譯器錯誤,這是一個很好的優勢。

+0

* declare-property-without-backing-variable *功能[只適用於x64和iOS](http://stackoverflow.com/questions/4511700/synthesizing-a-property-without-instance-variables),而不是x86(32位模式)和PPC,BTW。 – DarkDust 2011-03-08 09:23:51

+0

感謝DarkDust。這很好。從鏈接的問題看來,如果我們正在構建iOS 4之前,我們需要聲明支持變量。 – Krishna 2011-03-08 09:30:12

1

如果您使用date = [NSDate dateWithTimeIntervalSinceNow:0];這裏的日期是自動發佈的對象。

但是如果你使用self.date其財產被保留,它不是一個自動釋放的對象,我們應該明確的發佈日期只有當財產被定義爲(保留)

+0

...我們應該在'dealloc' *中明確地發佈date *。 – DarkDust 2011-03-08 12:39:32