2013-07-17 2 views
-5

이 내가 본 모든 싱글이 방법으로 호출되고,목표 - C - - 아이폰 OS 싱글 설명

+ (ALData *)sharedInstance { 

    static ALData *_shared; 
    if(!_shared) { 
     static dispatch_once_t oncePredicate; 
     dispatch_once(&oncePredicate,^{ 
      _shared = [[super allocWithZone:nil] init]; 
     }); 
    } 

    return _shared; 
} 

+ (id)allocWithZone:(NSZone *)zone { return [self sharedInstance]; } 
- (id)copyWithZone:(NSZone *)zone { return self; } 
#if (!__has_feature(objc_arc)) 
- (id)retain { return self; } 
- (unsigned)retainCount { return UINT_MAX; } 
- (void)release {} 
- (id)autorelease { return self; } 
#endif 

이제 내 싱글의 코드 이런 식으로 전화 : 내 방법을 만들 때

[SINGLETON classMethod]; 

것은 이렇게하려면 내가 이렇게 :

내가 이런 식으로 내 방법을 선언해야하는 첫 번째 방법으로 진행하려면
+ (BOOL)decide:(BOOL)var { 
    [self sharedInstance]; 
    if (var) 
     return NO; 
    else 
     return YES; 
} 

대신 :

- (BOOL)decide:(BOOL)var { 
    if (var) 
     return NO; 
    else 
     return YES; 
} 

을 내가 그것을 호출 할 때 나는 쓸 필요가 :

[[SINGLETON sharedInstance] decide:YES]; 

제 질문은 :이 두 접근법의 차이점은 무엇입니까? 둘 다 성능 측면에서, 둘 다 디자인 패턴 수준에서. 미학적으로 더 좋은 방법은 두 번째로 생각하기 때문에 이것을 알고 싶습니다. sharedInstance을 호출하지 않습니다.

나는 내 질문에

+2

http://stackoverflow.com/questions/13188982/singleton-instance-vs-class-methods –

+1

당신의 두 예제 사이에 관계가 없습니다를 호출합니다. 첫 번째 클래스는 Class 메소드를 호출합니다 (첫 번째 라인은 필요하지 않습니다. 왜 작성 했습니까?). 또 하나는 싱글 톤 인스턴스 –

+1

의 끔찍한 예제에서 인스턴스 메소드를 호출합니다. 당신의'+ decide :'메소드는 공유 인스턴스를 얻고, 아무것도 할당하지 않으며, 인스턴스를 필요로하지 않는다. '-decide :'메소드는 객체의 상태에 전혀 의존하지 않기 때문에 클래스 메소드 일 수도 있습니다. 가짜 예제 대신 실제 코드를 게시하십시오. – Caleb

답변

1

Singleton와 클래스 메소드의 무리와 함께 클래스 사이의 주요 차이점은 Singleton 상태의 어떤 종류를 보존 할 수 있다는 것입니다 분명하다 바랍니다. 예를 들어, 데이터 배열 또는 부울 플래그. sharedInstance을 호출하면이 클래스의 인스턴스에만 액세스 할 수 있으며 활성 상태로 유지됩니다. 데이터의 상태는 그대로 유지됩니다. 싱글 톤 클래스에 몇 가지 클래스 메서드를 확실히 추가 할 수는 있지만 작동합니다. 그러나 Singleton 패턴을 이스케이프합니다.

+0

그래서 sharedInstance를 호출해야하는 방식이 실제 싱글 톤 패턴입니다. 맞습니까? 다른 하나는 클래스 메소드가있는 "간단한"클래스입니다. 맞습니까? –

+1

@AndreaLufino 예. 첫 번째 경우에는 상태를 유지하는 싱글 톤 객체에 인스턴스 메서드를 호출하고 있습니다. 두 번째 경우에는 Class 메서드를 호출합니다. –

+0

좋습니다. 이제는 분명합니다. 그러나 하나 더 질문. 두 번째 케이스가 클래스 메소드를 가진 클래스 인 경우, 위에 sharedInstance 메소드를 작성하고 모든 클래스 메소드에서 호출해야합니까? –

0

공유 인스턴스를 반환하는 속성을 만든 다음 호출하십시오.

-(YourSingleton *)sharedStore 
{ 
    return [Singleton sharedInstance]; 
} 

그런 다음

[self.sharedStore decide:YES];