2011-04-13 5 views
18

수퍼 클래스의 속성을 재정의 할 수있는 몇 가지 경우가 있습니다.Objective-C의 속성 재정의 문제는 무엇입니까?

  1. 는 동일한 이름과 수퍼 클래스의 같은 속성을 가진 속성을 선언합니다. (당신이 당신은 컴파일러 경고를 얻을 수있는 속성을 변경하는 경우부터) .And 당신은 바르와 을 synthesieze 수 당신은 창조합니다. 무엇이 을 사용합니까? 또는 무엇이 상해 할 수 있습니까?

  2. 수퍼 클래스가 클래스 확장 (이름이없는 범주)의 속성을 선언하는 경우 헤더 파일에 이 아닐 수 있습니다. 헤더에서 해당 속성을 알고있는 경우 파일에 동일한 이름 인 속성을 지정하거나 클래스로 원하는 속성을 선언 할 수 있습니다. 그러나 setter/getter 메서드는 해당 "비밀 속성"에 대한 내용을 으로 대체합니다. 나는 이것이 단지 해를 끼칠 수 있다고 생각합니다. 그러나 헤더에서 알 수 없으므로 파일을 어떻게 피할 수 있습니까?

  3. 헤더 파일의 속성을 "readonly"로 선언 할 수 있으며 클래스 확장은 "readwrite"로 다시 선언 할 수 있습니다. 나는 이것이 좋은 일을 할 수있는 상황이라고 생각합니다.

이 상황에 대한 나의 이해가 적절합니까? 그리고 첫 번째와 두 번째 상황에서 좋은 점이 무엇인지 알지 못합니다. 하지만 첫 번째 상황을 피하고자한다면 선언하기 전에 서브 클래스에 이미 속성이 있는지 확인할 수 있습니다. 그러나 속성이 두 번째 상황에서와 같이 공개 헤더 파일에 없으면 무엇을해야할지 모릅니다.

답변

5

야생에서 사용 빈도를 변화와 함께, 당신이 언급 한 각각의 상황에 대한 적절한 장소가있다. 당신은 단지 자신을 밟지 않도록주의해야합니다. 나는 내가 개인적으로 만난 예를 들고 설명 할 것이다.

서브 클래 싱은 의도적으로 조 언급처럼, 당신이 속성을 재정의하기 전에 더 나은 일을하는지 정확히 알고 다른 옵션이없는 한,이 상황에서 속성
를 오버라이드 (override)합니다. 개인적으로 속성을 다시 선언하고 합성하지 않고 기존의 속성에 대한 단일 setter 또는 getter를 재정 의하여 사용자 지정을 얻는 것이 일반적으로 충분하다는 것을 개인적으로 발견했습니다. 예를 들어, UIClearColor 배경 만있는 특수한 UIView 하위 클래스를 생각해보십시오. 이를 시행하기 위해 경고 메시지를 인쇄 한 다음 super 구현을 호출하지 않고 -setBackgroundColor:을 무시할 수 있습니다. 나는 속성을 완전히 무시할 이유가 없었지만, 기존 속성을 완전히 납치해야하는 경우에는 유용한 도구가 될 수 없다고 말하지는 않습니다.

개인 속성
이것은 신용을 부여하는 것보다 유용합니다. 사유 재산에 대한 대안은 우리 모두가 잘 알고있는 평범한 'ivar입니다.

[_myIvar release], _myIvar = nil; 

나 :이 일부 주파수 변화하고 바르 경우, 당신은 다음과 같이 코드의 덩어리하게 될 겁니다 너무 나쁜 보이지 않지만

[_myIvar release]; 
_myIvar = [someValue retain]; 

을, 이런 메모리 관리 보일러 플레이트 코드는 정말로 오래되고 정말 빠릅니다. 또는, 위의 예를 보유 의미론을 사용하여 개인 속성으로 구현할 수 있습니다. 잠시 후 눈과 손가락에 훨씬 더 쉽게

self.myIvar = someValue; 

: 이것은 우리가 단지에 무슨 상관없이, 의미합니다. 이 속성은 나머지 우주에서 보이지 않기 때문에 우연히 하위 클래스에 의해 무시 될 수 있습니다. 이것은 Objective-C로 개발할 때 내재 된 위험이지만 위험을 줄이기위한 조치를 취할 수는 있습니다. 이러한 조치는 개인 재산의 이름을 예측 가능한 방식으로 수정하는 것과 유사합니다. 예를 들어 사유 재산 이름 앞에 머리 글자와 밑줄을 붙이는 것은 개인적인 정책입니다. 나에게는 mw_ivar과 같은 것이 있고 대응하는 -setMW_ivar:-mw_ivar 접근자를 얻을 것이다. 예, 통계적으로 누군가가 따라 와서 실수로 그 이름을 무시할 수 있지만 실제로는 그렇지 않습니다. 특히 코드를 사용할 수있는 사람들에게 사례를 게시 할 수있는 방법이있는 경우 특히 그렇습니다. 그리고 나는 애플이 주변에 가지 않았으며 그런 방식으로 엉망이 된 사유 재산을 만들었다 고 안전하게 말할 수있다. 그래서 당신은 그 앞에서도 안전 할 것이다.

는 공개적으로 읽기 전용,
개인적으로 읽기 쓰기 이것은 단지 표준 방법입니다. 당신은 그것이 유용하다는 것이 맞습니다, 또한 속성이 헤더에 있기 때문에 위험하지 않습니다. 우연히 그것을 무시하는 사람은 스스로 비난해야합니다.

+0

당신이 누리지 못했던 또 다른 용도는 서브 클래스에보다 구체적인 유형을 지정하는 것입니다. 나는.당신은 부모에'id' 형의 속성을 가지고 있습니다. 하위 클래스에서 속성 (예 : NSString *)을 다시 선언 한 다음 하위 클래스에서 @dynamic propertyName을 사용하여 컴파일러에서 상위 저장소를 사용하도록 알릴 수 있습니다. –

0

좋은 질문

  1. 개발자가이 시점에서 일을 을하고 기본 클래스 속성에 사용자 정의를 추가 할 필요가 무엇인지 알아야으로 이것의 사용을합니다. 그리고 이 무엇인지 알기 때문에 이 아닌 한 super의 구현을 제대로 호출 할 수 없습니다. super를 호출하지 않는 결정은 특히 클래스가 구현되는 방법을 모르는 경우 상황에서 해를 끼쳐서 이 유해 할 수 있습니다.

  2. 예이 유해한하지만 은 이상 카테고리 를 사용하여 조심스럽게 속성 또는 메서드의 이름을 선택하고 접두어 을 고려하지 방지 할 수 있습니다.

  3. 예, 정확합니다. 속성에 대한 액세스가 제한됩니다.# 2

    에 대한

@interface UIView(PFXextended) 
-(NSArray*)PFXGetSubviewsOfType:(Class)class; 
@end