2012-11-02 117 views
1

如果我有一個自定義的方法是這樣的:將參數傳遞給方法:是否應該保留參數?

- (void)myMethod:(id)myArgument 
{ 
     //do something with myArgument 
} 

被myArgument保證堅持圍繞該法的執行,如果我不採取它的所有權?

編輯 讓我進一步闡述。說我把這個地方:

[self myMethod:_myIvar]; 

,然後在其他地方,而myMethod的執行時,有人叫這樣的:

[_myIvar release]; 

這是否影響內myMethod的爭論?通過文檔/樣本碼

END EDIT

尋找,我很少在一個自定義的方法的上方看到[myArgument保留]或[myArgument拷貝。那是不必要的?

謝謝!

回答

1

如果myArgument是在myMethod開始一個有效的對象,不管你做什麼,以使其在該方法期間被釋放或以其他方式收集,那麼,myArgument仍然會在方法的最後一個有效的對象。

編輯迴應問題的編輯:讓我們來談談在這種情況下的對象所有權。當您通過myArgument作爲您的函數的參數時,您在myMethod的上下文中不會通過retain ing或copy聲明該對象的興趣。在這種情況下,對象的唯一所有者存在於myMethod之外。

如果myArgument最後老闆決定,它與myArgumentrelease的IT,那麼它完全有可能myArgument消失完成的 - 有對象沒有強引用任何更多的將保持它周圍。它可能是有效的,這取決於線程問題,涉及autorelease池和其他一系列問題,但這是一個危險的遊戲。如果甚至有可能發生這種情況,您應該按照Memory Management Policy的建議在myMethod內明確聲明myArgument的利益。

+0

比方說,我傳遞了一個伊娃,並且讓我們說,在執行myMethod:函數期間,伊娃會在其他地方被釋放。這個論點仍然值得保留嗎? –

+0

@SeanDanzeiser你剛纔陳述了確切的*相反*條件蒂姆指定將是必要的參數被保留。我會在這裏發脾氣,並建議:不。 – WhozCraig

-1

不,不能保證。您應該在任何你想要保留的地方撥打retain,並在完成時撥打release。否則,另一個線程並在此期間釋放它。

我在編寫遊戲的A *算法時遇到了困難。

0

如果有可能另一個線程可能導致myArgument引用的對象被釋放,那麼myArgument可以隨時成爲垃圾內存的指針,您將崩潰。

這與無法保留在-myMethod無關。您在保留方法調用期間可能會崩潰。相反,您必須修復應用程序中的破壞的,不可行的線程模型/體系結構。

這就是爲什麼線程很難。