比方說,我有一個實例變量NSDate *日期;我做(例如在viewDidLoad中):是否有差異使用self.variable ='一些價值'只是變量='一些價值'的實例變量
date = [NSDate dateWithTimeIntervalSinceNow:0];
或
self.date = [NSDate dateWithTimeIntervalSinceNow:0];
有這兩者之間有區別嗎?如果有哪一個是正確的,可能是爲什麼:)
感謝名單答案 拉吉斯拉夫
比方說,我有一個實例變量NSDate *日期;我做(例如在viewDidLoad中):是否有差異使用self.variable ='一些價值'只是變量='一些價值'的實例變量
date = [NSDate dateWithTimeIntervalSinceNow:0];
或
self.date = [NSDate dateWithTimeIntervalSinceNow:0];
有這兩者之間有區別嗎?如果有哪一個是正確的,可能是爲什麼:)
感謝名單答案 拉吉斯拉夫
是的,有區別。第一隻分配值的變量,而另一個被分配給一個屬性,因此,寫作是一樣的:如果你定義了你的財產爲@property(retain) NSDate *date;
默認實現
[self setDate:[NSDate dateWithTimeIntervalSinceNow:0]];
例如,(通過@synthesize date
)將釋放舊值並保留新值。您還可以提供自定義setDate:
實現,並在日期分配時執行一些操作。如果您只將值賦給變量,所有這些都不會發生。
通過聲明self.date =一定的價值;你實際上在做以下事情
if(date)[date release]; date = [somevalue retain];
。 – 2011-03-08 09:15:24
另外,如果按照您編寫的順序執行,那麼如果您重新分配與釋放相同的值,可能會導致引用計數器降至0並因此取消分配對象,將會發生不利情況。正確的順序是首先保留新值,然後釋放舊值,然後將新值賦給變量。 – DarkDust 2011-03-08 09:18:45
是的。 self.date調用名爲date的屬性的setter,並且如果您在屬性規範中給出了類似retain的內容,或者如果您提供了自己的訪問器,它們將被調用。
除非您絕對確定,否則在大多數情況下使用self.date總是比較好。還要注意,目前的編譯器允許您只是對一個屬性進行代理併合成,而無需使用自己的變量聲明。它優於顯式變量聲明。如果您使用該構造,則無論何時直接使用該變量而不使用訪問器,都會收到編譯器錯誤,這是一個很好的優勢。
如果您使用date = [NSDate dateWithTimeIntervalSinceNow:0];這裏的日期是自動發佈的對象。
但是如果你使用self.date其財產被保留,它不是一個自動釋放的對象,我們應該明確的發佈日期只有當財產被定義爲(保留)
...我們應該在'dealloc' *中明確地發佈date *。 – DarkDust 2011-03-08 12:39:32
這是否意味着,如果我做日期= [NSDate dateWithTimeIntervalSinceNow:0];日期將自動發佈,並且當我嘗試在稍後階段訪問此變量時,我可能會得到EXC_BAD_ACCESS? – Ladislav 2011-03-08 12:29:11
準確(如果您稍後未明確保留)。或者有時你沒有得到EXC_BAD_ACCESS,但是其他一些對象是在同一個位置創建的,因此你會得到有趣的結果。 – DarkDust 2011-03-08 12:38:37
這就是發生了什麼...因爲有時候我會得到EXC_BAD_ACCESS,其他時候我不會... Thanx – Ladislav 2011-03-08 12:40:52