2012-10-22 3 views
2

객관적인 C를 사용하여 개발하는 방법을 배우려하고이 책에서 도트 구문 (obj.var)을 사용하여 클래스에서 ivar에 액세스하려면 @virtualization을 사용하여 이러한 변수를 구현해야하지만, 이러한 vars에 대해 @properties를 정의하지 않고 이러한 종류의 액세스를 사용하면 정상적으로 작동하는 것 같습니다.도트 구문을 사용하여 메서드를 호출해도됩니까?

이러한 종류의 액세스는 어떻게 작동합니까? 자바처럼 사용하는 것이 좋은 습관입니까?

예 :

ComplexNumber *c1 = [[ComplexNumber alloc]init]; 
c1.realPart = 3; 
c1.imaginaryPart = 2; 

ComplexNumber 객체의 방법 :

- (double)modulus; 
-(void)setRadius:(double)aRadius phase:(double)aPhase; 
-(void)print; 
-(double)realPart; 
-(double)imaginaryPart; 
-(void)setRealPart:(double)value; 
-(void)setImaginaryPart:(double)value; 
+0

ComplexNumber 클래스에서 어떤 메서드가 선언 되었습니까? – Vladimir

+0

질문을 삽입하여 삽입했습니다. – thiagocfb

답변

4

없음의 안 좋은 관행, 당신은 기술적으로 도트 구문을 사용하여 제로 인수 방법에 액세스 할 수 있습니다하지만 지금은 엑스 코드는이 일에 대해 경고합니다. 이는 Apple의 코딩 지침에 위배됩니다.

호출 방법에는 대괄호 구문을 사용해야합니다.

+0

그런 뜻입니까? '[c1 print]' – thiagocfb

+0

Ok, 고맙습니다. – thiagocfb

+0

아니요, @synthesize를 사용하지 않아도됩니다. - xcode는 필드 앞에 밑줄이있는 필드를 생성합니다. –

6

속성은 클래스가 특정 메서드를 구현한다는 약속 일뿐입니다. 코드가 무엇을하고 있는지 도트 구문은 단지에 따라 적절한 이름을 가진 메소드로 호출로 변환됩니다 :

b = a.foo;   // becomes 'b = [a foo];' 
a.foo = b;   // becomes '[a setFoo:b];' 

그래서 당신이 실제로 그 방법이없는 경우에도 메소드를 호출하기 위해 도트 구문을 사용하여 멀리 얻을 수 있습니다 속성.

len = myArray.length // becomes 'len = [myArray length];' 

그러나 대부분은 당신이 그것을하지 말아야 :이 방법은 같은 배열의 length 액세스 방법으로, 속성처럼 작동 뭔가를 나타내는 경우 괜찮아 정렬 될 수 있습니다. 그것은 이 아닌 속성을 취하고 속성처럼 보입니다. 그것은 효과가 있을지 모르지만 코드를 보는 사람들을 혼란스럽게 할 것입니다 (미래를 포함하여). 속성 접근자가 부작용을 가질 것으로 예상되지 않기 때문에 부작용이있는 메서드를 호출 할 때는이 메서드를 사용하면 안됩니다.

+0

굉장한 설명 :) 감사합니다! – thiagocfb

관련 문제