2010-02-26 5 views
2
self.flipsidenavigationbar=aNavigationBar; 

왜 여기 자체가 필요합니까? (그렇지 않으면 충돌 함)도트 구문 문제

[flipsidenavigationbar pushnavigationietm........]; 

왜 여기 자체가 필요하지 않습니까?

flipsidenavigationbar는 속성으로 선언되고 합성 된 iVar입니다.

알렉스

+1

btw obj-c 객체 이름에 CamelCase를 사용하는 것이 일반적입니다. 'flipsideNavigationBar' – kubi

답변

2

flipsidenavigationbar는 "유지"속성 유형으로 선언 된 감사? 무슨 일이 일어 났는지에 대한 내 추측은 이것입니다.

당신이 그것을 쓴대로 도트 구문 방법은

[self setFlipsidenavigationbar:aNavigationBar]; 

에 해당하고이 메서드 호출은 당신이 그것을 설정할 때 aNavigationBar 개체를 유지 아마입니다. 당신이 그것을하고 당신의 충돌을 야기 할 전에

flipsidenavigationbar = aNavigationBar; 

를 호출 할 때 당신은 그것을 유지 하지은, 그것은 가능성이 출시되고 있습니다.

Obj-C에서 dot syntax에 대한 자세한 내용을 볼 수 있습니다. 향후 이와 같은 문제를 해결하는 데 도움이 될 것입니다.


다른 두 포스터는 더 잘했다,하지만이 두 줄 것을 기억하는 것이 매우 중요합니다 :

self.myViewA = myViewB; 
myViewA = myViewB; 

는 전혀 관련이 될 수있는 잠재력을 가지고있다. 도트 구문은 메서드 호출의 줄임말이며 메서드 호출을 원하는대로 수행 할 수 있습니다. 당신이 당신의 코멘트를 내가 하나가 설정해야 할 때/당신이 '자기'가 넣어 에 필요한 속성을 초기화하는 것을 이해

에 언급처럼 그 대신 속성을 다루는 규칙을 갖는 것이 중요합니다. 그러나, 당신이 ' (이 경우에는 푸시로)하는 것은'스스로 말할 필요가 없다 '고 말할 때.

정확히 무슨 일이 일어나는지 이해해야하므로 점 구문 사용의 효과가 무엇인지 알 수 있습니다. 혼란 스럽 습니다만, 실제로 어렵지는 않습니다. 행운을 빕니다!

+0

aNavigationBar는 setFlipSideNavigationBar에 놓은 후에 해제됩니다. setFlip ...은 보유 된 속성입니다. 모든 대답을 한 후에 나는 하나의 속성을 설정/초기화해야 할 때 '자기'를 넣어야한다고 이해합니다. 그러나, 당신이 '뭔가 할 것을 말하면 (이 경우 밀어 붙이십시오) 당신은 자기가 필요하지 않습니다. –

+0

이 답변에 대한 답변으로 내 대답을 편집했습니다. – kubi

2

도트 표기법의 광기 때문입니다. 나는 실제로 새로운 ObjC 개발자들이 위의 혼동 때문에 그것을 완전히 피할 것을 권장합니다.

flipsidenavigationbar은 포인터입니다. 은 단지 포인터입니다. flipsidenavigationbar = aNavigationBar라고 말하면 한 포인터를 다른 포인터로 바꿉니다. 이전 포인터를 유지했다면 해제하지 않습니다. aNavigationBar을 유지하지 마십시오. 이것은 C입니다. 여기에 마법은 없습니다.

self.flipsidenavigationbar이 아닙니다. 단순한 포인터입니다 (구조체와 정확히 일치 함에도 불구하고). 메소드 호출입니다. 가치로 환산하면 [self flipsidenavigationbar]입니다. lvalue는 [self setFlipsidenavigationbar:]입니다. 이 전화 코드. 대부분의 경우, setFlipsidenavigationbar: 메소드에는 이전 값의 릴리스와 새 값의 보유가 포함됩니다.

  • 항상, 항상 인스턴스 변수에 액세스하는 접근을 사용

    는 혼동을 피하기 위해해야 ​​할 몇 가지가 있습니다. 직접 액세스하지 마십시오.

  • 이렇게하려면 ivars를 접근 자와 완전히 같은 이름으로 정의하지 마십시오. 그래서 당신은이라는 이븐을 가지고 flipSideNavigationBar에 매핑됩니다. 이 구문은 @synthesize foo = _foo입니다.
  • 그렇게 할 수있는 한 도트 표기법을 사용하지 마십시오. 점 표기법 이전부터 ObjC에서 프로그래밍해온 사람들은 직관적으로 어떤 일을하는지 알기 때문에 심각한 문제가 거의 발생하지 않으며 입력하기가 쉽습니다. 그러나 새로운 개발자에게는 매우 혼란스럽고 일반적으로이를 피하는 것이 좋습니다. 자세히 알아보기 [self foo][self setFoo:] 이 코드는 훨씬 더 의미가 있습니다.
+0

"귀하의 ivars를 절대 접근 자와 동일한 이름으로 정의하지 마십시오." 그건 훌륭한 조언입니다. 확실히 새로운 코코아 서적의 첫 번째 장에 있어야합니다. – kubi

5

기억해야 할 점은 점이 iVar에 액세스하는 구문이 아니라 ivar을 설정하거나 가져 오는 방법을 호출하기위한 속기임을 기억해야합니다.

이것은 self.foo가 foo와 같지 않다는 것을 의미합니다 (foo는 속성으로 선언 된 ivar라고 가정). self.foo = value; [self setFoo : value]와 동일합니다. 또는 value = self.foo는 value = [self foo]와 동일합니다. foo를 쓸 때 메서드 호출없이 foo에 직접 액세스 할 수 있습니다.

setter 및 getter 메서드는 대개 값을 할당하거나 가져 오지 않고 값을 유지하기 때문에 구분하는 것이 중요합니다.

따라서, 귀하의 경우에 당신은 쓸 때 : 속성이 있음을 가정

[self setFlipSideNavigationBar:aNavigationBar]; 

:이 줄에 해당하므로

self.flipsidenavigationbar=aNavigationBar; 

당신은 실제로이 바르의 setter 메소드를 호출하고 복사본으로 정의되거나 유지되면 setter를 호출하면 aNavigationBar가 유지됩니다. 반면에 다음과 같이 쓸 경우 :

self.flipsidenavigationbar = aNavigationBar;

[flipsidenavigationbar foo]; 

: 다음

당신은 당신이 나중에

다른 질문에 대해서는 aNavigationBar에 액세스 할 때 응용 프로그램에 충돌이 발생할 수 있습니다 직접 aNavigationBar이 유지되지 않습니다 self.flipsidenavigationbar의 값을 설정하는 그냥 메소드 호출 일 뿐이므로 인스턴스 메서드에서 직접 ivars를 참조 할 수 있으므로 점을 사용할 필요는 없습니다 (가끔은 원할 수도 있음).

(BTW : 왜 낙타의 경우 사용하지 않습니까?이것은 실제로 눈이 아프다)