2011-02-13 3 views
0

인스턴트 싱글 톤을 갖기 위해 서브 클래스를 작성할 수있는 클래스를 작성하려고합니다. 여기 내가 지금까지 가지고있는 것이있다. 그것은 하나의 서브 클래스가 sharedInstance를 통해 또 다른 서브 클래스를 호출 할 때까지 작동하여 결국에는 메모리가 부족한 거대한 루프가 발생합니다.Objective-C 싱글턴 슈퍼 클래스?

아이디어가 있으십니까?

static NSMutableDictionary *sharedInstances = nil; 

@implementation Singleton 

+ (Singleton*)sharedInstance 
{ 
    [Singleton initSharedInstances]; 
    Class myClass = [self class]; 
    Singleton * sharedInstance = [sharedInstances objectForKey:myClass]; 
    @synchronized(myClass) 
    { 
     if (sharedInstance == nil) 
     { 
      sharedInstance = [[myClass alloc] init]; 
      [sharedInstances setObject:sharedInstance forKey:myClass]; 
     } 
    } 
    return sharedInstance; 
} 

+ (void) initSharedInstances 
{ 
    if (sharedInstances == nil) 
    { 
     sharedInstances = [[NSMutableDictionary alloc] init]; 
    } 
} 

@end 

답변

0

이 내가 할 수있는 서브 클래스로 즉석 싱글 톤을 갖습니다. 여기 내가 지금까지 가지고있는 것이있다. 그것은 하나의 서브 클래스가 sharedInstance를 통해 또 다른 서브 클래스를 호출 할 때까지 작동하여 결국에는 메모리가 부족한 거대한 루프가 발생합니다.

이것은 상호 재귀를 설명하는 것처럼 들립니다. subclass1이 subclass2를 호출하고 subclass2가 subclass1을 호출하면 간단한 자체 재귀와 마찬가지로 루프를 어딘가에서 분리해야합니다. 당신이 자신을 호출하는 init 방법은 sharedInstance를 호출하지 않는 한

귀하의 sharedInstance 자체가

7

왜이 모든 것을 고민하고 있습니까? -retain, -release, -retainCount+allocWithZone:을 재정의하여 수퍼 클래스에서 싱글 톤 동작을 시행하려는 경우 완전히 불필요한 작업을 수행하고있는 것입니다. 더 간단한 방법은 +sharedInstance 메소드를 제공하고 다른 작업은하지 않는 것입니다. 사용자가 실제로 +alloc/-init에 전화하기를 원한다면, 그럴 수 있습니다. 프레임 워크에서 이러한 유형의 싱글 톤의 예를 보려면 NSUserDefaultsNSFileManager을보십시오.하지만 후자의 경우 요즘 애플은 실제로 공유 인스턴스를 무시하고 NSFileManager의 인스턴스를 alloc/init하는 것을 권장합니다. 이 간단한 공유 인스턴스 물건을 수행하기 위해

, 당신이 할 일은, 싱글 톤 클래스에 구현되어 다음

나는 클래스를 작성하기 위해 노력하고있어
+ (id)sharedInstance { 
    static MyClass sharedInstance; 
    static dispatch_once_t predicate; 
    dispatch_once(&predicate, ^{ 
     //sharedInstance = [[MyClass alloc] init]; 
     sharedInstance = [MyClass alloc]; 
     sharedInstance = [sharedInstance init]; 
    }); 
    return sharedInstance; 
} 
+2

가 완전히 동의 ... 무한 재귀가 발생하지한다 싱글 톤 클래스의 메소드를 오버라이드하는 것이 일반적으로 다소 어리 석다는 것을 알았습니다. 당신이 모르는 무수한 사람들이 사용하게 될 프레임 워크에서 어떤 클래스에서는 의미가있을 수도 있습니다. 너 자신을 위해서? 그것을 간단하게해라! – bbum

+0

나는 약간 더 방어적인 패턴을 제공하기 위해 케빈의 코드를 편집했다. init에서 alloc을 분리하는 것이 유용 할 수있는 몇 안되는 시간 중 하나입니다. '-init' 메쏘드가'+ sharedInstance'에 대한 호출을 트리거한다면, 원래의 코드는 스스로 교착 상태가됩니다. – bbum

+0

좋은 지적입니다. '-init'가'+ sharedInstance'를 호출하는 곳에서는 코드를 작성한 적이 없지만, 필자는 그것이 일어난 것을 확실히 상상할 수 있습니다. –