2011-12-13 3 views
1

Singleton 상수 클래스가 있으며 애플리케이션 전체에서 사용하려는 인스턴스가 있다고 가정합니다.게으른 인스턴스화 및 편리한 메소드

someClass에 따라서 우리는이 오래된 정말 빨리 도착 [Constants instance] someCleverConstant];

타자를 참조 할 수 있으며 인스턴스에 대한 바로 가기를 얻을 것이 좋을 것이다.

-(Constants*) constants { 
    if (constants == nil) 
    constants = [Constants instance]; 
    return constants; 
} 

someClass에서이 방법, 따라서 우리는 constants.someCleverConstant; 대신

를 참조 할 수 있습니다

  • someClass, 우리는 @property (nonatomic, weak, readonly) Constants *constants;
  • 그리고 인스턴스에 대한 게터를 선언 할 수 있습니다 이것에 대한 몇 가지 질문 :

    • 내가 합리적인 접근법을 설명 했습니까?
    • 속성을 선언하는 것이 맞습니까? weak?
    • 내가 설명한 내용과 관련하여 성능 관련 문제가 있습니까? 직접 인스턴스를 호출하는 것이 실제로 좋을까요?
    • 20 개의 클래스가 있고 각각이 Constants 인스턴스에 대한 포인터를 필요로한다고 생각해보십시오. 그러면이 접근 방식이 효과가 있습니까?

    감사합니다.

+0

어떤 종류의 상수입니까? –

답변

1

[NSApplication sharedApplication]의 경우 NSApp과 같이 싱글 톤에 대한 전역 포인터를 만들면됩니다.

아마도 당신은 이미 구현 파일의 상단에

static Constants * defaultInstance = nil; 

같은 것을 가지고있다. 당신이 static를 제거하고 헤더에 변수를 선언하면합니다 (하는 .m 파일에 정의 유지) :

@interface Constants : NSObject 
// etc. 
@end 

extern Constants * defaultInstance; 

은 그런 이름 defaultInstance (아마 변경할 통해 싱글 인스턴스에 액세스 할 수 있습니다 이름, 비록 헤더를 가져 오는 모든 파일에서 (어쨌든하고 있어야합니다). 포인터를 사용하기 전에 -applicationDidFinishLaunching과 같이 프로그램 초기에 싱글 톤 설정 방법 (+instance 또는 무엇이든)을 호출해야합니다.

  • 나는 합리적인 접근법을 설명 했습니까?

나는 위 Paul.s의 대답에 설명 된 다른, 더 나은 방법이 있다고 생각합니다.

  • 는 속성 weak을 선언 맞습니까?

예,이 포인터가있는 클래스는 소유 할 필요가 없습니다.

  • 내가 설명한 내용과 관련하여 성능 관련 문제가 있습니까? 직접 인스턴스를 호출하는 것이 실제로 좋을까요?

어느 쪽이든, [Constants instance] 또는 self.constants 당신이 메시지 전송을하고 있습니다. 처음으로 self.constants을 할 때, 당신은 2를하고 있습니다. 그러나 이것 모두는 진짜 관심사가되어야합니다.

  • 은 20 개 수업을 상황, Constants 인스턴스에 각각 필요로하는 그 자체가 포인터를 생각해 보자. 그러면이 접근 방식이 효과가 있습니까?

내게는 다루기 힘들고 우아하지 않습니다.

2

이것은 글로벌 변수 나 함수를 사용하는 것부터 시작됩니다. 나는 그것들 중 어느 것이 더 합리적인 접근이라고 생각한다. 상수

1

은 내가 나에게 더 복잡한 요소를 반환하는 싱글 톤을 사용하는 동안이

// ConstanteDef.h 
#pragma mark Entity Name Constante 
#define kItemInfos @"ItemInfos" 
#define kCategorie_DItems @"Categorie_DItems" 
#define kCommerce @"Commerce" 
#define kListe @"Liste" 
#define kListeItem @"ListeItem" 
#define kPrixElement @"PrixElement" 
#define kTypeDe_CommerceOuListe @"TypeDe_CommerceOuListe" 

같은 .H 파일을 사용하는 것을 선호합니다.
여기에는 동일한 코드를 모든 곳에서 재 작성하는 대신 핵심 데이터를 사용하여 생방송을 간소화하기 위해 만든 싱글 톤이 있습니다. , 싱글 톤 개념에 대한 자세한 내용은

CoreDataController *cdc = [CoreDataController sharedCoreDataController]; 
Liste_MO * = [cdc newListe]; 

섹션 Creating a Singleton Instance에서 애플 설명서에 HERE을 봐 :

@interface CoreDataController : NSObject { 

NSManagedObjectContext *leManagedObjectContext; 
NSManagedObjectModel *leManagedObjectModel; 

@private 
Commerce_MO *leCommerceAucun; 
} 
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; 

#pragma mark Objet par Défaut 
@property (nonatomic, retain, readonly) Commerce_MO *commerceAucun; 

#pragma mark Nouvel Objet 
// new = retain count = 1, celui qui commande est responsable de la mémoire. 
- (id)newMOforClass:(Class)uneClasse; // Pas le mieux, mais pourrais servir pendant le run time. Retourne nil si uneClasse ne correspond pas à quelque chose. 
- (PrixElement_MO *)newPrixElement; 
- (ItemInfos_MO *)newItemInfos; 
- (Commerce_MO *)newCommerce; 
- (Liste_MO *)newListe; 
- (ListeItem_MO *)newListeItem; 

#pragma mark Singleton call 
+ (CoreDataController *)sharedCoreDataController; 
@end 

그래서 내 코드에서 나는 새로운 엔티티를 생성 할 필요가있을 때 난 그냥이 작업을 수행해야 , 그리고 그들에게 weak or strong에 대한 귀하의 심문에 응답해야하는 싱글 톤을 만들기 위해 제공하는 코드를 자세히 살펴보십시오.
그러나 본질적으로 엄격한 싱글 톤 구현에는 응용 프로그램의 전체 기간 동안 생성 된 해당 클래스의 인스턴스가 하나만있을 것입니다. 따라서 100 개의 객체를 가리키면 메모리 발자국이 바뀌지 않습니다. 단 하나의 싱글 톤이 있지만, 100 개의 객체가 있으면 메모리에 분명히 영향을 미칩니다.

3

@vinceburn 다음에 나는 상수에 대해 다음 예제를 사용하고 더 복잡한 구조에 대해서는 singleton을 사용합니다. 나는 자동 완성 및 컴파일러 검사를 얻을로

// Constants.h 
// Replace PSMyApp for something more useful. e.g. company/name initials followed by app/class 

// String example 
NSString * const PSMyAppString = @"constantString"; 

// Logically related integers 
typedef enum { 
    PSMyAppRelatedValuesOne = 0, 
    PSMyAppRelatedValuesTwo, 
    PSMyAppRelatedValuesThree 
} PSMyAppRelatedValues; 

// Float example 
const CGFloat PSMyAppFloat = 0.3f; 

// Integer that has no related values 
const NSInteger PSMyAppInteger = 2; 

나는 #define 이상이 선호 애플이 UIKit 클래스의 일부에 일을하는 방식에 더 자연스럽게 맞습니다.

+0

'# define'에 대한 코드 완성이 있습니다. 그리고 문자열 이외의 다른 것들은 #define을 최대한 멀리 유지합니다. 여러분이 지적한 것처럼 디버깅하기가 더 어렵 기 때문입니다. 나는 보통'key/value coding '의 일부인'string'에 대해서만 그것을 사용합니다. 오타가 발생하지 않도록하십시오. –

+0

나는 그것을 자동 완성했다는 것을 몰랐다. 나는'#define'으로 결코 많은 행운을 얻지 못했지만, 그것은 단지 xcode 일 수있다. 관심사가 어째서 내 예제처럼'extern'이 아닌'# define'을 문자열에 사용합니까? 이점이 있습니까? –

+0

커다란 C 배경이 없으며 처음으로 키워드를 'extern'으로 혼란스럽게 생각하고 객관적 C를 배우는 동안 책에서 읽고있는 것은 주로 #define을 사용하기 때문에 채택했습니다. 그것. 어떤 장점을 모르겠다. 필자는 자동 완성 기능을 제공하고 컴파일러가 문자열에 있기 때문에 캐치하지 못하는 문자열에서 오타를 피한다는 점을 제외하고는 'extern'을 사용해서도 알 수있다. –

관련 문제