// AddressBookModel.h
@interface AddressBookModel : NSObject
{
    NSMutableArray *aData;
}

@property (nonatomic, retain) NSMutableArray *aData;

+(AddressBookModel *)sharedInstance;
+(void)killInstance;
-(NSString*)print;
@end

// AddressBookModel.m
static AddressBookModel *_addressBookModelSingleInstance = nil;

@implementation AddressBookModel : NSObject

@synthesize aData;

-(NSString*)print
{
    NSMutableString *str = [NSMutableString string];
    for (int i = 0; i < [aData count]; i++ )
    {
        [str appendFormat:@"%@ ", [aData objectAtIndex:i]];
    }
    
    return str;
}

-(id)init
{
    self = [super init];
    
    if ( self != nil ) 
    {
        // 데이터 초기화 장소
        self.aData = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
    }
    
    return self;
}

-(void)dealloc
{
    NSLog(@"AddressBookModel dealloc=>Ref Count=%d", [self retainCount]);
    
    [aData release];
    [super dealloc];
}

+(AddressBookModel *)sharedInstance
{    
    @synchronized(self) 
    {
        if ( _addressBookModelSingleInstance == nil ) 
        {
            _addressBookModelSingleInstance = [[AddressBookModel alloc] init];
            NSLog(@"AddressBookModel sharedInstance=>Ref Count=%d", [_addressBookModelSingleInstance retainCount]);
        }
    }
    
    return _addressBookModelSingleInstance;
}

+(void)killInstance
{
    @synchronized(self)
    {
       if (_addressBookModelSingleInstance != nil )
       {
            [_addressBookModelSingleInstance dealloc];
            _addressBookModelSingleInstance = nil;
       }     
    }
}

+(id)allocWithZone:(NSZone *)zone {
    @synchronized(self) 
    {
        if (_addressBookModelSingleInstance == nil) 
        {
            _addressBookModelSingleInstance = [super allocWithZone:zone];
            return _addressBookModelSingleInstance;
        }
    }
    return nil;
}

-(id)copyWithZone:(NSZone *)zone {
    return self;
}

-(id)retain {
    return self;
}

-(unsigned)retainCount {
    return UINT_MAX;
}

-(oneway void)release {
}

-(id)autorelease {
    return self;
}

@end

인터넷을 뒤지니까 대략 비슷한 소스코드가 쏟아집니다.
다른 문제는 다 해결됐는데 아무리 디버깅을 해봐도 dealloc 메소드가 호출되지 않네요.
결국 'killInstance'라는 클래스 메소드를 만들어서
내부에서 강제로 dealloc를 호출해주고 있습니다.
결국 문제는 싱글턴 만드는 것 까지는 좋은데 dealloc같이 메모리가 정확하게 해제되는 시점이 필요하다는 것입니다.
그렇지 않다면 메모리 해제시에 특정 작업을 처리 할 수가 없는 일이 발생하기 때문에 특정상황에서 애매해지는 일이 발생합니다.
전 억지로 killInstance라는 클래스 메소드를 만들었는데
혹 다른 방법을 알고있으시다면 알려주세요 ㅠㅠ 

posted by 뚱2