검색결과 리스트
singleton에 해당되는 글 2건
- 2011.09.04 [iOS] Objective-C Singleton 만들기 2
- 2008.03.17 [Design Patterns] C++을 사용한 Singleton
글
// AddressBookModel.h
// AddressBookModel.m
다른 문제는 다 해결됐는데 아무리 디버깅을 해봐도 dealloc 메소드가 호출되지 않네요.
결국 'killInstance'라는 클래스 메소드를 만들어서
내부에서 강제로 dealloc를 호출해주고 있습니다.
결국 문제는 싱글턴 만드는 것 까지는 좋은데 dealloc같이 메모리가 정확하게 해제되는 시점이 필요하다는 것입니다.
그렇지 않다면 메모리 해제시에 특정 작업을 처리 할 수가 없는 일이 발생하기 때문에 특정상황에서 애매해지는 일이 발생합니다.
전 억지로 killInstance라는 클래스 메소드를 만들었는데
혹 다른 방법을 알고있으시다면 알려주세요 ㅠㅠ
@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라는 클래스 메소드를 만들었는데
혹 다른 방법을 알고있으시다면 알려주세요 ㅠㅠ
'Mobile > iPhone / Xcode' 카테고리의 다른 글
[iOS] iOS에서는 보안상의 이유로 dynamic library Project를 만들수 없습니다. (0) | 2011.09.12 |
---|---|
[iOS] 아이폰 초성 검색 클래스를 만들어 보자 (0) | 2011.09.10 |
[iOS] iOS5 Beta 7에서는 Window-Based Application가 없어졌습니다. (0) | 2011.09.04 |
[iOS] UIButton의 alpha 값에 따른 이벤트 유무 (0) | 2011.08.16 |
[iOS] Rounded Rect View + ActivityIndecator (0) | 2011.08.14 |
트랙백
댓글
글
이번에 프로젝트를 하면서 전역객체를 사용할 일이 생겼었습니다.
전역객체로 진행하던중 이왕이면 디자인패턴을 사용해보자!!!
그래서 싱글턴을 이용해 보려고 합니다.
* Singleton Patterns ::
해당 클래스의 인스턴스가 한개만 생성해서 그 인스턴스를 전역객체 처럼 어디서든지
사용 할 수 있게 하는 디자인패턴입니다.
// Singleton.h
class CSingleton
{
private:
static CSingleton * m_pUniqueInst;
CSingleton();
public:
~CSingleton();
static CSingleton & GetInstance();
};
// Singleton.cpp
#include "Singleton.h"
// static 초기화
CSingleton* CSingleton::m_pUniqueInst = NULL;
CSingleton::CSingleton()
{
}
CSingleton::~CSingleton()
{
if (m_pUniqueInst)
delete m_pUniqueInst;
}
CSingleton & CSingleton::GetInstance()
{
if (m_pUniqueInst == NULL)
m_pUniqueInst = new CSingleton;
return *m_pUniqueInst;
}
간단하게 만들어본 싱클턴입니다.
GetInstance() 멤버 함수가 static으로 선언되어 있기 때문에 아무곳에서나
호출 가능합니다. 그리고 생성자가 private로 선언되어 있기때문에 CSingleton의
인스턴스를 만들려고 하면은 컴파일 에러가 발생합니다.
ps. 위 싱글턴은 싱글스레드 용입니다. 멀티스레드에서는 문제가 생길수 있습니다.
'C/C++ > VC++ / MFC' 카테고리의 다른 글
[MFC] SS_NOTIFY와 Reflection Message (0) | 2008.03.24 |
---|---|
[MFC] 사용자 정의 메세지 (0) | 2008.03.19 |
[MFC] MFC에서 클래스 전역으로 사용하기 (0) | 2008.03.11 |
전처리 명령문에서 사용하는 defined 연산자 (0) | 2008.03.03 |
[MFC] HitTest() (0) | 2008.03.03 |
RECENT COMMENT