본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] #25 서드 파티 클래스에는 반드시 카테고리 이름을 접두어로 붙여라

by 돼지왕 왕돼지 2017. 9. 9.
반응형

 [Effective Objective-C] #25 서드 파티 클래스에는 반드시 카테고리 이름을 접두어로 붙여라


출처 : Effective Objective-C

duplicate definition of category, override, Warning, [Effective Objective-C] #25 서드 파티 클래스에는 반드시 카테고리 이름을 접두어로 붙이라, 공통 접두어, 네임스페이스, 덮어쓰기, 런타임, 메서드, 메서드 리스트, 버그, 접두어, 충돌, 카테고리, 카테고리 이름, 컴파일 경고, 클래스 메서드 리스트


-

카테고리는 소스코드가 없는 클래스에 기능을 추가하기 위해 흔히 사용된다.

이 기능은 매우 막강하지만 또한 이 기능을 사용함으로써 생기는 문제를 간과하기 쉽다.

그 문제는 바로 카테고리의 메서드가 마치 클래스에 원래 있었던 것처럼 클래스의 일부분이 되는 사실 때문에 발생한다.

이는 카테고리가 로딩될 때 실행 시간에 일어난다.

런타임은 카테고리가 구현한 메서드들을 살펴보고 나서 메서드들을 클래스의 메서드 리스트에 추가한다.

추가하는 카테고리의 메서드가 이미 클래스에 있다면, 추가되는 카테고리 메서드가 기존 메서드를 덮어 쓴다.

이런 식의 덮어쓰기(overriding)는 지속적으로 발생할 수 있다.

그렇기 때문에 원본 클래스의 구현을 덮어쓴 카테고리의 메서드도 또 다른 카테고리의 메서드가 덮어써버릴 수도 있다.

결국 마지막으로 로딩된 카테고리의 메서드가 쓰일 것이다.



-

이 문제를 해결하는 전형적인 방법은 정의하는 카테고리 이름과 메서드에 네임스페이스를 붙이는 것이다.

오브젝티브-C 에서 네임스페이스를 부여하는 유일한 방법은 이름 앞에 공통 접두어를 붙이는 것이다.

상황에 잘 맞는 접두어를 골라야 한다.

가끔 접두어가 여타 앱이나 라이브러리에서 사용하는 것과 겹칠 수 있기 때문이다.



-

기술적으로 카테고리 이름에 네임스페이스를 붙일 필요는 없다.

이름이 같은 카테고리가 두 개 있더라도 문제가 되지 않는다.

그러나 좋은 사용예는 아니고 카테고리 이름이 겹치면 다음과 같은 컴파일러 경고를 보게 될 것이다.

warning: duplicate definition of category ‘HTTP’ on interface ‘NSString'



-

클래스에 추가한 카테고리의 메서드는 앱 내 그 클래스의 모든 인스턴스에 적용된다는 점을 꼭 기억해야 한다.

카테고리를 추가하다가 우연히 이전의 메서드를 덮어써 버리거나 메서드가 서드 파티 라이브러리가 추가한 카테고리와 충돌한다면 까다로운 버그들이 발생할 수 있다.



-

의도적으로 카테고리의 메서드로 덮어쓰는 것은 나쁜 사용 예다.

특히 여러분의 코드가 이미 다른 사용자들이 연동해서 사용 중인 라이브러리일 때는 더욱 문제가 된다.




기억할 점


자신이 소유하지 않은 클래스에 카테고리를 추가할 때는 항상 카테고리 이름에 접두어를 붙이라.


자신이 소유하지 않은 클래스에 카테고리를 추가할 때 카테고리의 메서드에도 접두어를 항상 붙이라.




반응형

댓글