2012-11-20 3 views
2

좋아, 혼란스러워! 내가 사용하는 데 사용 -> 내 인스턴스 객체에 액세스 할 때마다,하지만 지금 난 내 응용 프로그램을 설정 한 후 볼이 같은 didFinishLaunching : 나는 예외와 함께 밖으로 던져있어 도로 아래로'.'의 차이점은 무엇입니까? 및 '->'iOS?

self->counter = [NSNumber numberWithFloat:0.0f]; 

, 확인 내 디버거와 내가에 라인을 변경하는 카운터가 <non objective c object>

를 가리키는했다 보았다

self.counter = [NSNumber numberWithFloat:0.0f]; 

그리고 지금 내가 네 또 다른 변수가 디버거에서 참조하십시오.

여기에 무슨 일이 일어나고 있습니까?

답변

3

self->counter = [NSNumber numberWithFloat:0.0f];은 ivar에 대한 직접 액세스를 사용합니다. self의 경우 counter = [NSNumber numberWithFloat:0.0f];과 같습니다. 여기서 counter은 ivar입니다. 다시 말하면, self->은 인스턴스 메소드 내의 중복 스코어 자격입니다.

self.counter = [NSNumber numberWithFloat:0.0f];[self setCounter:[NSNumber numberWithFloat:0.0f]];에 대한 구문 당입니다. 특히 선언은 객체의 setter에 동적으로 메시지를 보냅니다. Although there are exceptions 부분적으로 생성/삭제 된 상태가 아닌 경우 접근자를 사용해야합니다.

+1

이 정답에 추가하려면 'self-> counter'형식은 인스턴스 메소드 범위에서 중복 될뿐만 아니라 ivar이 표시되지 않는 한 해당 범위 밖에서 경고 (또는 오류)가 발생합니다 (기이하게 ...)'@ public' – FluffulousChimp

+0

@NSBum Right +1, ObjC에서는 액세스가 일관되지 않고 복잡합니다. 최신 ABI 용으로 작성하는 경우 액세스가 올바르게 검사됩니다. 오래된 ABI 또는 컴파일러는 대신 경고를 내 보냅니다. '@ implementation' 블록에서 선언 될 때 기본값으로'@interface'와'@ private'에 선언되어 있다면 디폴트로'@ protected'됩니다. clang은 또한'@ implementation' 본문 (예 : 정적 함수를 사용하는 경우)에서 비공개에 대한 액세스를 허용합니다 - 예상대로 '@ 구현'본문 외부의 오류입니다 O_O – justin

2

iVars와 속성의 차이점에 대해 묻습니다. 이 질문에 대한 좋은 대답은 이미 here입니다.