2012-08-15 2 views
4

여기에서 어떤 일이 일어나는지 명확히 할 수 있습니까? brainModel이라는 클래스가 있는데 다시 operandStack이라는 NSArray가 있습니다. 정확히 무엇을 의미 하는가 - 나는 단순히 그것을Objective-C : 부작용 컴파일러 경고에 게터를 사용해서는 안됩니다.

self.brainModel.operandStack.removeAllObjects; 

을 "removeAllObjects을"메시지를 보내는 그러나 그것은 나에게 경고 "게터가 부작용을 사용하지 않아야되지 않는 속성 액세스 결과를"제공 점 표기법을 사용하여 어레이에 접근하고있다?

[[[self brainModel]operandStack]removeAllObjects]; 

모두가이 점 표기법의 잘못된 사용과는 anythig가 않습니다 ... BTW 작동이 같은 중첩 된 브래킷 구문을 사용하여

경고를주지 않는다? 또는 "removeAllObjects"와 같은 인수를 보내는 것과 같이 메시징 개체에 도트 표기법을 사용하는 것이 좋습니다.

+0

아마도'removeAllObjects'에 반환 유형이'void'라는 것을 볼 수 있습니다. 따라서 분명히 getter로 사용하지 않을 것입니다. –

+0

@ Paul.s. 전혀 답변이 안됩니다. –

답변

5

removeAllObjects은 (는) 재산이 아닙니다. 그것은 방법입니다.

속성 액세스 표기법은 일반적으로 속성이 같은 이름의 메서드를 사용하여 액세스되기 때문에 작동합니다. 그러나 속성 값을 가져 오면 객체가 포함 된 객체가 변경되지 않으며 (또는 다른 변경 작업도 수행됩니다.) removeAllObjects의 경우는 그렇지 않습니다. 이것은 컴파일러가 참조하는 "부작용"입니다.

아마, 대신이 호출을 수행 할 것입니다 :

[self.brainModel.operandStack removeAllObjects]; 

selfbrainModel 속성을 가져옵니다, 다음 self.brainModeloperandStack 속성은 다음에 removeAllObjects를 호출합니다.

1

removeAllObjects는 메소드입니다. 점 표기법을 통해 메서드에 액세스 할 수 없습니다. 속성 만.

+0

하지만 가능합니다. –

+0

할 수 있겠지만, 그래야합니까? 그것은 도덕과 종교에 대한 문제입니다. –

0

각 메서드를 속성으로 선언 할 필요는 없습니다. 특히 개체를 수정하는 경우는 제외합니다. 게터는 부동산에 대한 접근 자로 간주되어야합니다 (직접 백업 쌍을 노출시키지 않아야 함). '액션'인 메소드는 (예 : @property 키워드없이 선언되고 도트 표기법 대신 대괄호를 사용하여 호출 됨) 선언되어야합니다.

+0

그건 내 제안이 어떻게 잘못되었는지 설명하지 않습니까? 합법적으로 반환 값을 가진 메서드를 선언하고 도트 표기법과 함께 사용할 수 있습니다. 'NSArray'에서'- (NSUInteger) count;'를 체크하면'@property (nonatomic, assign, readonly) NSUInteger count'로 선언되지 않지만 많은 사람들이 아무런 문제없이 그것을 사용합니다. 귀하의 대답은 속성을 사용하는 철학에 대해 설명하지만 필자는 컴파일러의 신음에 대해 설명하지는 않는다고 생각합니다. –

+0

@ Paul.s 그것은 단지 컴파일러가 불평하는 ** 구문 오류가 아니라는 것을 당신이 이해하지 못하는 것 같습니다. 이것은 구문 뒤에있는 철학입니다. –

+0

동의어는 중요한 철학이지만, 컴파일러가 메소드 선언에 'void'를 리턴해야한다는 것을 간단히 말하면서, 부작용이 있다는 것을 어떻게 알 수 있습니까? 합법적으로 추가 할 수 있음을 명심하십시오. 내 메서드 시그니처가 실제로 뭔가를 반환하면 부작용이 발생합니다. –

관련 문제