예전에 Objective-C에서 Singleton 객체를 만드는 방법에 대해 써놓은 글(http://b4you.net/blog/210)이 있었는데 사용하다보니 몇 가지 제약이 있어 새로 만들어 보았습니다.
문제는 singleton 클래스를 하나 만들어 두고 그 클래스를 상속받으면 하위 클래스도 singleton 객체가 되게끔 하려고 하는데 여기서 여러 클래스가 상속을 받게 되면 static 객체를 공유한다는 것이었습니다.
각 객체마다 static 영역이 있어서 공유되는게 당연한데 상속 구조를 고려하지 않고 구현을 해놓은 바람에 귀찮은 문제가 발생하더군요. 이러한 것들은 C++이야 template를 사용하여 처리하면 되는데 Objective-C는 그렇게 되질 않아 다음과 같이 수정하였습니다.
+ (SingletonClass *)sharedSingletonClass
{
static NSMutableDictionary *dictionary = nil;
id sharedObject = nil;
NSString *className;
// for DCL
if(dictionary == nil)
{
@synchronized(self)
{
if(dictionary == nil)
{
dictionary = [[NSMutableDictionary alloc] init];
}
}
}
className = NSStringFromClass([self class]);
sharedObject = [dictionary objectForKey:className];
// for DCL
if(sharedObject == nil)
{
@synchronized(self)
{
sharedObject = [dictionary objectForKey:className];
if(sharedObject == nil)
{
sharedObject = [[[self class] alloc] init];
[dictionary setObject:sharedObject forKey:className];
}
}
}
return sharedObject;
}달라진 부분은 NSDictionary를 사용한 점 입니다. 이렇게 처리하면 dictionary 내에서 search 할 때의 속도 때문에 overhead가 발생하긴 하겠지만, 상속 구조에서도 깔끔하게 잘 사용할 수 있습니다.
아직까진 다른 문제점은 없었으나 문제가 발생하면 3탄을 만들어야겠군요 ㅎㅎ



Attribution/Share Alike 2.0 license






