2013-12-12 2 views
1

나는 서비스 모음에 대한 액세스를 제공하기 위해 순전히 정적 인 상태 비 저장 패라우드가있는 상황이 있습니다. NS_ROOT_CLASS를 기본 클래스를 제공하는 대신 사용할 생각입니다. 외관에 메모리 관리가 필요하지 않기 때문입니다. 고려 :IOS 개발을 위해 NS_ROOT_CLASS가 '안전'합니까?

NS_ROOT_CLASS 
@interface UtilityThing 
+ (void) Service1; 
+ (void) Service2; 
@end 

서비스 1 & 서비스 2 효과적으로 표현 서비스 클래스의 '싱글 같은'인스턴스. 코드 호출은 다음과 같습니다.

[[UtilityThing Service1] thingService1Does];

사람을합니까 : 그외에도 더 인스턴스 데이터가 없다는 사실에서

, 나는 유일한 코드를 완성 제안 관련된 것들 ( XCode 5: Is there any way to group/filter/sort what shows up in code-completion? 재)되도록, 클래스의 사용을 단순화하기 위해 일부 NS_ROOT_CLASS를 선택했다 응용 프로그램이 인증을 통과하지 못하게하는이 패턴에 문제가 있는지 확인하십시오. 아니면 NS_ROOT_CLASS를 사용할 때해야 할 다른 기술적 고려 사항이 있습니까?

+0

전역 기능'UtilityService1'과'UtilityService2'를 정의하는 것보다 이것이 더 좋은가? –

+0

UtilityService *와 같은 장황한 규칙이 적용될 수 있지만 사용자가 모든 유틸리티 *를 통해 정렬 할 필요가 없기 때문에 약간만 사용할 수 있습니다. –

+0

@robmayoff -이 경우에는 서비스의 싱글 톤 인스턴스가 기본 서비스가 싱글 톤으로 구현되지 않고 서로에 대해 알기를 원했습니다. 그래서 facade는 각 서비스에 필요한 참조를 주입합니다. –

답변

1

모든 것이 정상입니다. 자신 만의 루트 클래스를 만들 수 있습니다. UtilityThing의 인스턴스를 만들 필요가없는 경우에는 올바르게 표시됩니다.

3

예, 당신은 할 수 있습니다.

하지만 그렇게하지 마십시오.

새 루트 클래스 (클래스 메서드 만 포함하는 새 루트 클래스조차도)를 정의하는 것은 매우 비 전형적인 패턴입니다. 나는. 거의 끝나지 않았다. 디버거 및/또는 다른 개발 도구가 약간 이상하게 취급 할 가능성이 높다는 점에 대해서는 절대로하지 마십시오.

그냥 NSObject의 서브 클래스로 선언하십시오. 또는 거의 확실하게, 당신은 유틸리티의 일부로서 상태를 저장하기를 원할 것이기 때문에 싱글 톤을 만들고 그것들을 인스턴스 메소드로 만들면 그 시점에서 리팩토링해야 할 것입니다.

참고 : 메서드는 소문자로 시작해야합니다.

+1

클래스를 NSObject의 하위 클래스로 만드는 데 오버 헤드가 없다는 점은 주목할 가치가 있습니다. 그러나 자신 만의 루트 클래스를 만드는 데 관련된 많은 문제가 있습니다. – Chuck

+0

위의 사용 사례에 대한 컨텍스트를 조금 더 추가했습니다. 나는 아직도 당신의 대답이 의미가 있다고 믿는 동안, 나는 잠재적으로 중요한 몇 가지 비트를 빠뜨린 것을 읽음으로써 깨달았습니다. –

+3

@ J.Paulding 코드 완성 이유는 유효하지만 일반적으로이 경험의 클래스 메소드는 내가 언급 한 스테이트먼트 이유로 인스턴스 메소드에 재 도입되는 것이 일반적이다. 그러나 그 말로는, 당신이 말한 class *를 인스턴스화하려고하지 않는 한, 루트 클래스를 만드는 것에 어떤 문제도 없다. 시스템상의 전체 스택은 NSObject의 서브 클래스 (또는 매우 신중하게 설계된 프록시)가 될 것으로 기대합니다. – bbum

관련 문제