objective-c - oc单例的一些问题
给我你的怀抱
给我你的怀抱 2017-04-28 09:05:51
0
2
675

第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿

1.+ (User *)shareUser {

static User *_sharedSingleton = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
    _sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;

}

2.static User *_sharedSingleton = nil;

@implementation User

  • (User *)shareUser {
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{

       _sharedSingleton = [[self alloc] init];

    });
    return _sharedSingleton;
    }

  • (id)allocWithZone:(NSZone *)zone
    {
    if (_sharedSingleton == nil) {

       _sharedSingleton = [super allocWithZone:zone];

    }
    return _sharedSingleton;
    }

  • (id)copyWithZone:(NSZone *)zone
    {
    return _sharedSingleton;
    }

给我你的怀抱
给我你的怀抱

모든 응답(2)
左手右手慢动作

그렇습니다. 첫 번째는 현재 ObjC 싱글톤의 표준 코드입니다.

으아아아

이러한 싱글톤 방식은 ARC(자동 메모리 관리) 모드의 표준 형식입니다. 외부에서 호출할 때 [类名 shareUser]가 직접 싱글톤을 가져옵니다. 인터페이스는 h 파일에 작성하고 _sharedSingleton을 사용하지 마세요.

xxx.h

으아아아

여기instancetype는 현재 클래스의 유형을 반환합니다.

두 번째 코드의 경우 static User *_sharedSingleton = nil;를 전역 변수로 작성하는 것은 MRC 시대의 작성 방법으로, (id)allocWithZone:(NSZone *)zone를 다시 작성하는 등의 방법도 있으며, 이 역시 옛날 방식의 작성 방법입니다.

小葫芦

static 키워드로 수정된 정적 변수의 수명 주기는 동일합니다. 컴파일 타임에 초기화되고 프로그램이 종료될 때만 메모리가 해제됩니다! 그러나 변수에는 범위가 있습니다. 예를 들어 첫 번째 작성 방법에서 이 변수는 로컬 정적 변수이며 이 메서드에서만 사용할 수 있습니다. 두 번째 작성 방법의 경우, 이 변수는 전역 정적 변수이며 전역적으로 사용할 수 있습니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿