2012-08-15 25 views
4

有人可以澄清這裏發生了什麼。我有一個叫做brainModel的類,它又有一個名爲operandStack的NSArray。我只是訪問數組在發送消息「removeAllObjects」Objective-C:吸氣劑不應該用於副作用編譯器警告

self.brainModel.operandStack.removeAllObjects; 

但使用點符號它給了我一個警告「未使用的屬性訪問結果 - 干將不應當用於副作用」究竟是什麼意思?

使用嵌套括號的語法像這樣沒有給出警告:

[[[self brainModel]operandStack]removeAllObjects]; 

兩個作品順便說一句......它有anythig做錯誤的使用點號的?或者像這樣的消息傳遞對象時使用點符號被認爲是好的做法 - 發送它像「removeAllObjects」這樣的參數。

+0

這可能是因爲'removeAllObjects'返回類型爲'void',所以你很明顯沒有將它用作getter – 2012-08-15 15:27:46

+0

@ Paul.s,根本沒有看到我的答案。 – 2012-08-15 15:28:21

回答

5

​​不是屬性;這是一種方法。

使用屬性訪問表示法可行,因爲屬性通常使用同名的方法訪問。但是,預計獲取屬性值不會更改包含該對象的對象(或進行任何其他更改),但​​不是這種情況。這些是編譯器所指的「副作用」。

也許,你會想,而不是執行這個調用:

[self.brainModel.operandStack removeAllObjects]; 

這得到的selfbrainModel財產,那麼self.brainModeloperandStack屬性,然後調用它​​。

1

removeAllObjects是一種方法。您不能通過點符號訪問方法;只有屬性。

+0

但是,你可以。 – 2012-08-15 15:39:54

+0

你可以,但應該嗎?這是一種道德和宗教問題。 – 2014-04-18 18:39:59

0

您不需要將每個方法都聲明爲一個屬性 - 特別是如果它們正在修改對象,則不需要聲明每個方法。吸氣者應該被視爲物業的訪問者(不直接暴露後援伊娃)。被稱爲「動作」的方法應該被聲明爲這樣(即,沒有使用關鍵字@property進行聲明,並且使用括號而不是點符號進行調用)。

+0

這並不能解釋我的建議是錯誤的嗎?我可以合法地聲明一個帶有返回值的方法,並用點符號來使用它。檢查' - (NSUInteger)count;'在'NSArray'中它沒有被聲明爲'@property(nonatomic,assign,readonly)NSUInteger count',但很多人都以任何方式使用它,沒有問題。雖然你的回答解釋了使用屬性的哲學,但我不認爲它解釋了編譯器呻吟。 – 2012-08-15 15:37:45

+0

@ Paul.s它確實如此,它似乎你不明白,**它不是一個編譯器抱怨的語法錯誤**,這正是語法背後的哲學。 – 2012-08-15 15:39:31

+0

一致認爲它是重要的哲學,但我只是說,編譯器必須處理方法簽名有一個'void'返回,否則它會知道它有副作用 - 記住我可以合法地添加如果我的方法簽名實際上返回了一些副作用。 – 2012-08-15 16:03:44