2011-08-22 5 views
2

objective-c 책에서 싱글 톤 예제를 보았습니다. 그러나 objective-c와 다른 langs 사이에 'singleton'정의의 의미가 다른지 나는 모른다. 이 [[SingletonClass alloc] init]을 사용하여 새 객체를 만들 수 있습니까? 그렇다면 메모리에 오직 하나의 객체가 있음을 보장하는 방법은 무엇입니까?객관적인 c의 싱글 톤

#import "SingletonClass.h" 

@implementation SingletonClass 

static SingletonClass *sharedInstance = nil; 

// Get the shared instance and create it if necessary. 
+ (SingletonClass*)sharedInstance { 
    if (sharedInstance == nil) { 
     sharedInstance = [[super allocWithZone:NULL] init]; 
    } 

    return sharedInstance; 
} 

// We can still have a regular init method, that will get called the first time the    Singleton is used. 
- (id)init 
{ 
    self = [super init]; 

    if (self) { 
     // Work your initialising magic here as you normally would 
    } 

    return self; 
} 
+0

가능한 중복 : 목표 - C : 정적 필드와 구현 싱글 톤 패턴 (http://stackoverflow.com/questions/6912703/objective-c-static-field-and-implemented-singleton-pattern/6913036 # 6913036) –

답변

8

콜린 윌러 (Colin Wheeler)의 게시물은 Singletons in Cocoa입니다.

나는 싱글 톤의 바람직하지 않음에 대해 콜린에 동의한다.

+1

+1 좋은 링크 - Apple의 코드는 스레드 안전을 고려하지 않습니다. – Caleb

2

진정한 싱글 톤, 즉 한 번만 인스턴스화 할 수있는 객체를 원한다면 Apple 문서 (Creating a Singleton Instance)를 살펴보십시오.

기본적으로 개체 할당 및 관리와 관련된 여러 가지 방법이 있습니다 : + allocWithZone (+ alloc에 ​​의해 호출 됨), -retain, -release, -copyWithZone 등으로, 싱글 톤 클래스의 인스턴스를 두 개 이상 만드는 것은 어렵다. (런타임을 직접 호출하여 두 번째 인스턴스를 생성 할 수는 있지만 지점을 파악하기에 충분해야합니다.)

Objective-C에 대한 글을 어느 정도 용량으로 작성한 거의 모든 블로거가 의견을 제시했습니다. 싱글 톤을 구현하는 방법. 그 의견들 중 상당수는 꽤 좋은 것처럼 보이며, 대부분은 상당히 유사합니다. Dave DeLong은 그가 말하는 것에 대해 알고 있으며, his piece on singletons은 짧고 달콤하며 곧장 알아 듣습니다.

0

싱글 톤에 대한 언어 지원은 없지만 직접 할 수 있습니다. 싱글 톤 예제 here을보십시오. 그래도 스레드로부터 안전하지는 않습니다. + sharedManager 대신 + 초기화 할 개체를 할당 할 것이다.

2

objective-c와 다른 langs 사이에 '싱글 톤'정의의 의미가 다른지는 알 수 없습니다.

그것은

C.

에서 파생 된 언어의 일반적인 정의를 다음과

이 [[SingletonClass의 ALLOC는 초기화] 여전히 새로운 개체를 만드는 데 사용할 수 있습니까?

네, 어떻게 메모리에 하나의 객체가 보장하는 경우?

패턴을 적용하지 마십시오 (예 : 강제로 싱글 톤이되지 않음). 그냥 정상적인 물건을 만드십시오. 그런 다음 하나의 인스턴스 만 실제로 원한다면 인스턴스를 만들어 재사용을 위해 일부 저장하십시오 (일반적으로 실행 당 한 번 만들어지기 때문에 앱 대표는이 작업을위한 하나의 일반적인 장소입니다).

실제 야생에서 본 대부분의 (> 95 %) ObjC 싱글 톤 구현은 잘못된 이유로 사용되어 정상적인 객체보다 좋거나 좋을 것입니다.

답변에 링크 된 모든 솔루션에는 (최소한) 미묘한 문제, 위험 또는 바람직하지 않은 부작용이 있습니다.

0

싱글 톤 클래스는 앱의 어느 곳에서나 사용할 수 있도록 데이터를 저장하는 데 사용됩니다.

//SingletonObject 
#define saveDataSingletonObject ((SaveDataSingleton*)[SaveDataSingleton sharedManager]) 

@interface SaveDataSingleton : NSObject 

@property (nonatomic,strong) NSMutableArray *DataArr; 
+ (id)sharedManager; 
-(void)clearAllSaveData; 

@end 

@implementation SaveDataSingleton 
@synthesize DataArr; 
+ (id)sharedManager { 
    static SaveDataSingleton *sharedManager; 
    if(!sharedManager) { 
     @synchronized(sharedManager) { 
      sharedManager = [SaveDataSingleton new]; 
     } 
    } 
    return sharedManager; 
} 
-(void)clearAllSaveData{ 
    DataArr=nil; 
} 
- (id)init { 
    if (self = [super init]) { 
     DataArr = [[NSMutableArray alloc]init]; 
    } 
    return self; 
} 
// using setter getter save and retrieve data 
+(void)setDataArr:(NSMutableArray *)Dataarr 
{ 
    self.DataArr = [[NSMutableArray alloc]initWithArray:Dataarr]; 
} 

+(NSMutableArray *)DataArr 
{ 
    return self.DataArr; 
} 
@end 

저장 및 검색 데이터 //를 사용하여 단일 객체

// save data using setter function. 
[saveDataSingletonObject setDataArr:Array]; 
//fetch data using getter function. 
NSArray *arr=[saveDataSingletonObject DataArr];