2012-03-03 4 views
7

카테고리와 관련된 협약은 Apple 클래스를 확장 할 때 접두사를 포함하는 것입니다. 예를 들면 :카테고리 앞에 마술 단어를 붙이기위한 규칙은 무엇입니까?

[string XXDataUsingUTF8]; 

, initset,

은 내가 덜 명확하고있어 식별자가 copy 시작 때 규칙이 무엇인지입니다 (네, 그냥 갈 바보 같은 예입니다.). 또는 new. 예를 들어

:

[request setHTTPBodyWithKeyValues: keyValues]; 

내 접두사를 추가하는 경우, 이것은 더 이상 규칙 "세터가 세트로 시작"다음 없습니다. 내가 설정 한 후 접두사를 추가하면 다른 한편으로

[request XXSetHTTPBodyWithKeyValues: keyValues]; 

는 정말 더 이상 접두사 없습니다 :

[request setXXHTTPBodyWithKeyValues: keyValues]; 

이 몹시 set으로 가져올 수 없습니다,하지만 난 그게 더하게 생각 init, copy 등과 같이 중요합니다.

Apple이 어디에서 문서화 했습니까? 공통적으로 사용되는 것은 무엇입니까?

+2

나는 여기에 대한 공식 지침을 볼 수 있지만, ARC 또는 LLVM 정적 분석기, 또는 기타 혼동하지의 이익에없는 것 도구 또는 코드를 읽는 사람이라면 선택기 시작 부분에 기존 접두사를 그대로 유지할 수 있습니다. 개인적으로, 나는 "진짜"메소드가 하나도 포함하지 않으므로 카테고리 확장 메소드 이름에서 밑줄을 사용하여 "접두어"의 고유성을 보존합니다. 당신의 예제에서는'setXX_HTTPBodyWithKeyValues ​​:'가 될 것입니다. 컨벤션을 기반으로하지 않는 확장 메소드에서는 'XX_myMethodName'이됩니다. – pmdj

+0

이것이 실제로 유일한 * 실용적인 대답이라고 생각합니다. 그렇지 않습니까? 명백한 지적 주셔서 감사합니다. :) –

+1

매우 흥미로운 요점! 어떤 사람들은 자신의 "네임 스페이스"문자열을 접미사로 쓰는 것을 선호합니다 :'setHTTPBodyWithKeyValues_XX :'어떤 것이 더 예쁘지는 않습니다. –

답변

11

당신은 인터페이스 선언에서 명시 적 방법 제품군을 설정할 수 있습니다 :

@interface NSObject (StevenFisherCategory) 

- (NSData *)XXCopyDataUsingUTF8 __attribute__((objc_method_family(copy))); 

@end 
+0

이것은 좋은 지적입니다. 이는 특히 ARC와 함께 LLVM을 사용하는 Xcode 4.3 이상에서 계속 사용되는 접근 방식입니다. –

+1

좋은 답변입니다. 내 접두사가 붙은 init 메소드를 작동시키는 법을 알아 내려고했습니다. '''__attribute __ ((objc_method_family (init)))'''트릭을 했어요. – edelaney05

관련 문제