self.flipsidenavigationbar=aNavigationBar;
왜 여기 자체가 필요합니까? (그렇지 않으면 충돌 함)도트 구문 문제
[flipsidenavigationbar pushnavigationietm........];
왜 여기 자체가 필요하지 않습니까?
flipsidenavigationbar는 속성으로 선언되고 합성 된 iVar입니다.
는알렉스
self.flipsidenavigationbar=aNavigationBar;
왜 여기 자체가 필요합니까? (그렇지 않으면 충돌 함)도트 구문 문제
[flipsidenavigationbar pushnavigationietm........];
왜 여기 자체가 필요하지 않습니까?
flipsidenavigationbar는 속성으로 선언되고 합성 된 iVar입니다.
는알렉스
이 flipsidenavigationbar
는 "유지"속성 유형으로 선언 된 감사? 무슨 일이 일어 났는지에 대한 내 추측은 이것입니다.
당신이 그것을 쓴대로 도트 구문 방법은
[self setFlipsidenavigationbar:aNavigationBar];
에 해당하고이 메서드 호출은 당신이 그것을 설정할 때 aNavigationBar
개체를 유지 아마입니다. 당신이 그것을하고 당신의 충돌을 야기 할 전에
flipsidenavigationbar = aNavigationBar;
를 호출 할 때 당신은 그것을 유지
하지은, 그것은 가능성이 출시되고 있습니다.
Obj-C에서 dot syntax에 대한 자세한 내용을 볼 수 있습니다. 향후 이와 같은 문제를 해결하는 데 도움이 될 것입니다.
다른 두 포스터는 더 잘했다,하지만이 두 줄 것을 기억하는 것이 매우 중요합니다 :
self.myViewA = myViewB;
myViewA = myViewB;
는 전혀 관련이 될 수있는 잠재력을 가지고있다. 도트 구문은 메서드 호출의 줄임말이며 메서드 호출을 원하는대로 수행 할 수 있습니다. 당신이 당신의 코멘트를 내가 하나가 설정해야 할 때/당신이 '자기'가 넣어 에 필요한 속성을 초기화하는 것을 이해
에 언급처럼 그 대신 속성을 다루는 규칙을 갖는 것이 중요합니다. 그러나, 당신이 ' (이 경우에는 푸시로)하는 것은'스스로 말할 필요가 없다 '고 말할 때.
정확히 무슨 일이 일어나는지 이해해야하므로 점 구문 사용의 효과가 무엇인지 알 수 있습니다. 혼란 스럽 습니다만, 실제로 어렵지는 않습니다. 행운을 빕니다!
aNavigationBar는 setFlipSideNavigationBar에 놓은 후에 해제됩니다. setFlip ...은 보유 된 속성입니다. 모든 대답을 한 후에 나는 하나의 속성을 설정/초기화해야 할 때 '자기'를 넣어야한다고 이해합니다. 그러나, 당신이 '뭔가 할 것을 말하면 (이 경우 밀어 붙이십시오) 당신은 자기가 필요하지 않습니다. –
이 답변에 대한 답변으로 내 대답을 편집했습니다. – kubi
도트 표기법의 광기 때문입니다. 나는 실제로 새로운 ObjC 개발자들이 위의 혼동 때문에 그것을 완전히 피할 것을 권장합니다.
flipsidenavigationbar
은 포인터입니다. 은 단지 포인터입니다. flipsidenavigationbar = aNavigationBar
라고 말하면 한 포인터를 다른 포인터로 바꿉니다. 이전 포인터를 유지했다면 해제하지 않습니다. aNavigationBar
을 유지하지 마십시오. 이것은 C입니다. 여기에 마법은 없습니다.
self.flipsidenavigationbar
은 이 아닙니다. 단순한 포인터입니다 (구조체와 정확히 일치 함에도 불구하고). 메소드 호출입니다. 가치로 환산하면 [self flipsidenavigationbar]
입니다. lvalue는 [self setFlipsidenavigationbar:]
입니다. 이 전화 코드. 대부분의 경우, setFlipsidenavigationbar:
메소드에는 이전 값의 릴리스와 새 값의 보유가 포함됩니다.
는 혼동을 피하기 위해해야 할 몇 가지가 있습니다. 직접 액세스하지 마십시오.
flipSideNavigationBar
에 매핑됩니다. 이 구문은 @synthesize foo = _foo
입니다.[self foo]
및 [self setFoo:]
이 코드는 훨씬 더 의미가 있습니다."귀하의 ivars를 절대 접근 자와 동일한 이름으로 정의하지 마십시오." 그건 훌륭한 조언입니다. 확실히 새로운 코코아 서적의 첫 번째 장에 있어야합니다. – kubi
기억해야 할 점은 점이 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 : 왜 낙타의 경우 사용하지 않습니까?이것은 실제로 눈이 아프다)
btw obj-c 객체 이름에 CamelCase를 사용하는 것이 일반적입니다. 'flipsideNavigationBar' – kubi