2013-08-27 93 views
0

我知道當使用ARC並且您有NSString屬性時,您會像使用MRC一樣執行@property(nonatomic, copy)。但我不知道,當我將我的項目ARC,我仍然有這個在我的初始化方法:使用ARC時的「複製」

_someString = [someStringParameter copy] 

這是一個錯誤?或甚至與ARC,我是否仍然需要明確地說「copy」?或者我應該這樣做:

self.someString = someStringParameter 

並且一切都會好嗎?這裏有點迷茫......

回答

1
_someString = [someStringParameter copy]; 

這是一個錯誤?

甚至與ARC,我還需要明確地說, 「複製」?

絕對。

你正在通過拷貝分配實例變量,它在ARC下是完全合法的。與之相對的是,正是這樣做:

_someString = someStringParamenter; 

會引起ARC自動保留(不復制),從而導致類似

_someString = [someStringParameter retain]; 

這是因爲ARC變量下有一個隱含的__strong標識,除非另有規定。


self.someString = someStringParameter 

這是正確的,並且都在ARC和MRC你會得到的要複製的對象,如果你提供的財產申報的copy屬性。

這就是說,它仍然是一個壞主意在初始化程序中使用存取方法,因爲它們可能有不需要的副作用,如果您有自定義實現它們。看看這個問題的答案:Should I refer to self.property in the init method with ARC?

+0

感謝您的回覆。我從不重寫屬性方法,所以我就這樣做。我有時遇到的是我必須從初始化程序中調用訪問屬性的方法,而且我也必須從代碼中調用相同的方法。你如何處理這種情況?該方法中的屬性應該是點符號還是直接訪問變量? –

+0

如果你**絕對肯定**你所調用的訪問器方法沒有任何副作用,你可以從初始化器中安全地調用它們。無論如何,我不會習慣它,因爲這是一種不好的做法,很容易犯錯誤並引入可怕的錯誤。如果你可以分開你的邏輯,那會更好,因爲初始化和對象應該在概念上與其他任何事情分開。 –

+0

我想它發生在我需要重新加載的模式中。我將它加載到初始化程序中,然後如果用戶在應用程序購買中製作,則需要重新加載。 –

2

你永遠不會在你的初始化程序中使用self.someString = anything。點符號是一個方法調用。您不應該對尚未完全實例化的類調用方法。最明顯的失敗案例:一個子類覆蓋了setSomeString: - 調用該方法時,它的init在哪裏?

ARC將處理適當的實例變量的保留和釋放,但不能自動執行復制 - 例如,有__strong__weak修飾符,但沒有__copy。因此,在進行直接實例變量賦值時,您仍然需要顯式複製。

+0

感謝您的回覆。我從不重寫屬性方法,所以我就這樣做。我有時遇到的是我必須從初始化程序中調用訪問屬性的方法,而且我也必須從代碼中調用相同的方法。你如何處理這種情況?該方法中的屬性應該是點符號還是直接訪問變量? –

+0

問題是,即使你個人沒有重寫屬性訪問器,編寫你的代碼以避免它們被覆蓋也會導致在界面或其他地方無法充分表達的約束。所以這被認爲是不好的做法。調用結果性方法可能引發完全相同的問題,所以它在形式上存在問題。 – Tommy