업데이트 : 오늘이 조언을주고, 내가 사용을 공유 인스턴스를 말할 경우 :
[[SomeClass shared] doSomething];
:
@interface SomeClass: NSObject
{
+(SomeClass *)shared;
}
@implementation SomeClass
{
+(SomeClass *)shared {
static SomeClass *shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [SomeClass new];
});
return shared;
}
}
는 그 다음 앱에 걸쳐 처음 사용할 때 당신을 위해 인스턴스를 자동 및 사용할 수 있습니다
개체의 전역 공유 인스턴스 인 단독 개체를 사용할 수 있습니다. 다른 소스 파일에 개체에 액세스해야 할 때 다른 기준에 대해서와 같이
@interface SomeClassSingleton : NSObject {
}
+(SomeClass*)sharedSomeClass;
+(void)setSharedSomeClass:(SomeClass*)someObject;
@end
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
return _someObject;
}
+(void)setSharedSomeClass:(SomeClass*)someObject
{
@syncrhonized(self)
{
_someObject = someObject;
}
}
@end
그런 다음, 당신은 다른 헤더에 싱글을위한 헤더 파일을 가져옵니다. 당신이 자동 inits 처음으로 당신이 그것을 접근하는 싱글 톤 구현을 만들 수
[[SomeClass sharedSomeClass] someSharedClassMessage];
// OR
SomeClass* someObject = [SomeClass sharedSomeClass];
또는 : 읽기/싱글을
SomeClass* someObject = [[SomeClass alloc] init];
[SomeClassSingleton setSharedSomeClass:someObject]; // write to save your singleton
사용 :
싱글 만들기
@implementation SomeClassSingleton
static SomeClass* _someObject = nil;
+(SomeClass*)sharedSomeClass
{
@synchronized(self) {
if (_someObject == nil) {
_someObject = [[SomeClass alloc] init];
}
}
return _someObject;
}
@end
안녕하세요. 좋은 답변에 감사드립니다. 왜 동기화 되었습니까? –
'@ syncrhonized'는 스레드 안전을위한 것입니다. iOS와 같은 다중 스레드 환경에서는 한 번에 둘 이상의 스레드가 공유 객체를 수정하지 않아야합니다. 정적 객체 또는 여기 구현 된 싱글 톤은 단 하나의 복사본으로 메모리에 존재합니다. '@synchronized'는 전달한 객체를 잠 그어서 스레드간에 액세스를 "동기화"함으로써 잠긴 상태에서 액세스하려고 시도하는 모든 스레드가 잠금이 열릴 때까지 기다려야합니다. 이것은 잠금이 설정되어있는 동안 두 번째 스레드가 계속되는 것을 막는 기본적인 "차단"메커니즘입니다. – nekno
좋은 친구 야! –