2012-03-09 5 views
0

나는 어떤 물건을 돌려주는 NSMutableArray을 가지고있다. 내가 추가 한 객체에는 속성 이름, 나이가 있습니다. 내가 반환 된 객체 (obj.name 또는 obj.age)에 이러한 속성을 사용하는 경우NSObject 포인터에서 속성을 호출하면 빌드 오류가 발생하는 이유는 무엇입니까?

지금 컴파일러는 이러한 회원, 내가 NSObject의 습관이 회원을 가지고 이해 대신 (.)

의 (->)를 사용하지 말한다 그러므로 재산을 이해하지 못할 것입니다.

하지만이 속성 대신 setter 및 getters 메서드 ([obj name] 또는 [obj age]) 구문을 사용하면 오류가 발생하지 않습니다.

그러나 속성을 사용한다는 것은 setter 또는 getter 만 호출한다는 의미입니까?
광고 목표 C는 동적 언어라고 생각하나요?

답변

1

그렇다면 오른쪽 - 점 구문은 지원되지 않습니다.

당신은 실제 클래스에 대한 포인터를 캐스팅 할 필요가

:

((MyObject*)[array objectAtIndex: 0]).name = @"Bill"; 
3

당신이 당신의 객체 타입 (MyObject)에 반환 된 객체를 캐스팅 하는가?

당신은 같은 것을 수행해야합니다 [[mutableArray objectAtIndex:0] name] 구문은 당신이 (유형 id이다) 반환 된 객체의 메소드를 호출하고 있다는 점이다 사용하는 경우

((MyObject*)[mutableArray objectAtIndex:0]).age = 20; 

이유 당신이 오류를 받고 아니에요을, 그리고 id은 (아직) 존재하지 않는 메서드를 호출하면 컴파일 타임에 숨 막히지 않는 경향이 있습니다. 런타임에 [mutableArray objectAtIndex:0]이 입력되면 MyObject을 입력하면 [obj name] 메시지가 올바르게 구현됩니다 (IMP). MyObject으로 해결되지 않으면 앱이 중단됩니다.

컴파일 타임 경고가 표시되지 않는 이유는 Xcode가 코드베이스에 name 메서드를 구현하는 클래스가 하나 이상 있음을 알고 있으므로이 메서드를 호출하는 것으로 신뢰한다고 해당 클래스의 인스턴스에서((MyObject*)[mutableArray objectAtIndex:0]).ageeeeee = 20;과 같은 작업을 수행하면 충돌이 발생할 가능성이 매우 높으므로 경고 메시지가 표시됩니다. 앱의 클래스가 ageeeeee정적으로 메서드를 구현하지 않습니다.

유형 id에는 name 속성이 없으므로 도트 구문을 사용할 수 없습니다.

실제로이 사건은 ObjC가 동적 언어라고 불리는 이유를 완벽하게 보여줍니다!

+0

그게 전부입니다. 도트 구문은 setter 또는 getter 메서드에 대한 호출을 나타내는 것으로 가정합니다. 메서드 호출로 존재 여부와 관계없이 작동하지 않아야합니까? 어쨌든 .. 설명해 주셔서 감사합니다 :) –

+0

속성이 읽기 전용으로되어 있다면 어떻게 될까요? 컴파일러가 당신이 말하는 클래스/속성을 정확하게 알고 있지 않다면, 적어도 값을 설정하고자하는 경우에는 그것을 사용할 수 있어야하는지 여부를 알 수 없습니다. – UIAdam

+0

@UIAdam : 좋은 지적이지만 속성이 읽기 전용이면 setter가 생성되지 않고 런타임에 "인식 할 수없는 선택기를 개체 예외로 보냈습니다"가 표시됩니다. –

관련 문제