2011-12-13 74 views
2

我可能已經跳進了Objective-C的有點太快了,並認爲我知道足夠的內存管理潛水的。原來我不是。如何設置屬性值在Objective-C的正確方法

快進一點,我趕上了......大部分。我最後剩下的問題之一是@ property/@綜合過程並正確設置這些值。

我經常看到這樣的:

SomeObject *obj = [[SomeObject alloc] init]; 
self.obj = obj; 
[obj release]; 

這是有道理的,但我不知道這實現了類似的事情足以成爲一種替代方案:

self.obj = [[[SomeObject alloc] init] autorelease]; 

請問這是可以接受的任何地方,你可能會設置值爲@propertyobj?或者是直接訪問實例變量優先於init方法中的那兩個?

obj = [[SomeObject alloc] init]; 

謝謝。

編輯:絕對相關question討論我的一半問題。我的問題的autorelease部分被引用在其中一個答案中,但尚未得到確認。

所以我的問題依然存在:

  1. autorelease在這種情況下,一個有效的替代?
  2. autorelease可以用這種方式在init方法中使用,還是應該直接在init方法中設置實例變量?
+0

密切相關的,可能重複:http://stackoverflow.com/questions/7842641/best-way-to-set-a-retained-property-to-a-newly-created-object – 2011-12-13 22:27:13

回答

3

唯一的區別是,在你的第一個例子,obj立即釋放(雖然它大概是由self.obj二傳手保留)。這兩個例子實際上是相同的。

需要注意的是展望未來,我們可以依靠ARC處理在適當的時候釋放對象,所以你可以寫:

self.obj = [[SomeObject alloc] init]; 

,讓ARC擔心放在哪裏釋放或自動釋放。

更新:您好像在問-init方法內的情況。你需要知道的兩兩件事是:

  1. 如果可能的話,你應該直接訪問實例變量在-init-dealloc方法。這個想法是爲了避免如果您的訪問器被子類覆蓋時可能發生的問題。還有一些其他的問題,在這裏更加深入,使解決這一問題,如:

    Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

  2. 如果你在一個-init方法創建一個對象並將其分配給伊娃,你可能不想在稍後的時間點釋放它,例如-dealloc。所以是的,在-init方法中沒有釋放你創建的對象(只要你保留對它們的引用)就沒​​問題,但是你仍然可以在-dealloc中將+alloc-release平衡。

+0

好,那是有道理的。那麼`init`方法會發生什麼,或者實例變量是否爲`nil`?應該直接設置,還是使用`autorelease`的setter很好? – joshhepworth 2011-12-13 22:13:10

相關問題