2009-10-11 3 views
3

코코아 헤드가 UIView와 그 하위 클래스가 NSCopying 프로토콜을 채택하지 않는 이유를 설명 할 수 있습니까?UIView (또는 그 하위 클래스)가 NSCopying Protocol을 채택하지 않는 이유는 무엇입니까?

철학적으로 볼 때 UITouch가 복제를 준수하지 않는 이유는 매우 일시적인 개체이기 때문입니다. UIView에 의해 그것의 서브 클래스, 특히 UIButton은 처럼 보이고을 복사 할 수 있어야합니다.

물론 애플은 그들이하는 일을하기에 좋은 이유가 있습니다. 그 이유를 아십니까?

+0

보기를 복사해야하는 상황이 있습니까? – Abizern

+0

이 질문은 정보 제공에 불과합니다. 그러나 질문에 대한 답변을 얻으려면 UIButtons를 사용하는 것이 좋습니다. UIButton은 다른 버튼과 거의 비슷했습니다. 그래서 첫 번째 버튼을 두 번째 버튼으로 복사하고 싶었습니다. 몇 가지 차이점을 수정하십시오. – SooDesuNe

답변

4

"왜 안 되니?"라고 물어 보는 질문이 보일 것입니다. 그러나 "왜 그럴까?" 그렇게하는 것이 요지가 아닙니다. 라이브보기를 복사 할 필요가 거의 없습니다. 일반적으로 템플릿보기는 NSCoding 프로토콜 (인터페이스 작성기)을 통해 생성되며, 복사 가능한 모든보기가 유용 할 것입니다.

+3

12 개 정도의 재사용 가능한 셀을 만들 때 뷰와 같은 개체의 복사본을 여러 개 만들려는 경우의 좋은 예가 UITableView에 있습니다. 하나를 복사 할 수 있다는 것은 UIViews/UIButtons/UILabels 등의 다중 할당보다 훨씬 쉽습니다. – mahboudz

+1

예를 들어, IB의 UIView 하위 클래스를 통해 체스 조각을 만들었습니다. 이제 모든 유사한 체스 조각들에 대한 복제본을 원합니다. 각 조각을 자체 NIB 파일에 넣으면 조금 바보스럽고 비효율적 인 것처럼 보입니다. * 명백한 * 할 일은 OP가 제안한 것이지만 UIView를 복제하는 간단한 방법이없는 것 같습니다. – wcochran

+1

@wcochran : 그게 중요 할 경우 원하는 동작을 구현하는 UIView 하위 클래스를 만드는 것을 막을 수있는 방법은 없습니다. 당신이 멍청하고 바보 같지 않고 비효율적 일 뿐이므로 모든 뷰 클래스에 누군가가 복사를 구현하도록 요구합니다. – Chuck

4

흥미로운 질문입니다. Chuck의 대답 외에도 나는 그 이유가 애플이 디자인 결정을 내렸기 때문에 그 이유가 있다고 덧붙이고 싶었다. 진짜 구체적인 이유는 없지만 그것이 결정되었습니다.

UIView이 몇 가지 다른 클래스의 하위 클래스로 사용 되었기 때문에 엔지니어가 서브 클래스에 NSCopying을 강제로 적용하고 싶지 않았기 때문에이 결정이 내려 졌을 수도 있습니다.

3

NSCopying은 개체 그래프의 깊은 (재귀 적) 복사본에는 그리 크지 않습니다. 예를 들어 [NSArray copy]은 개체 자체가 아니라 개체 목록을 복사합니다. 객체 그래프는 NSCoding에 더 잘 게재됩니다. 행복한 일치가 UIView에 의해 지원됩니다.

속성이있는 사용자 지정보기를 복사하려면 NSCoding을 지원해야합니다. 예 :

+0

UIVIews가 NSCoding을 구현한다는 것은 흥미로운 일이지만 실제로 질문에 대답하는 것과 관련이 없습니다. –

+1

@ MarkL, 나는 생각합니다. NSCopying을 채택한 클래스는 규칙에 따라 얕은 복사를하는 것처럼 보입니다. UIView의 얕은 복사본은 일반적으로 유용하지 않습니다. 각 UIView 하위 클래스의 모든 속성이 NSCopying을 지원해야하므로 딥 복사는 비실용적입니다. –