在这个单例类中使用init有什么用?

Ank*_*ava 2 iphone singleton objective-c ios

@接口

//
//  Created by macbook on 31.05.12.
//
// To change the template use AppCode | Preferences | File Templates.
//


#import <Foundation/Foundation.h>


@interface CESettings : NSObject
+ (CESettings *)sharedInstance;

- (void)save;
@end
Run Code Online (Sandbox Code Playgroud)

@implementation

//
//  Created by macbook on 31.05.12.
//
// To change the template use AppCode | Preferences | File Templates.
//


#import "CESettings.h"

@interface CESettings ()
@property(nonatomic, strong) NSUserDefaults *userDefaults;
@end

@implementation CESettings
@synthesize userDefaults = _userDefaults;

#pragma mark - Singleton
static CESettings *_instance = nil;
+ (CESettings *)sharedInstance {
    @synchronized (self) {
        if (_instance == nil) {
            _instance = [self new];
        }
    }

    return _instance;
}

- (id)init {
    self = [super init];
    if (self) {
        self.userDefaults = [NSUserDefaults standardUserDefaults];
    }

    return self;
}

#pragma mark - Methods
- (void)save {
    [self.userDefaults synchronize];
}

@end
Run Code Online (Sandbox Code Playgroud)

我有一个用于应用程序中的设置的类.该类还有一个创建singleton和init方法的方法.两者有什么用?我认为如果sharedInstance方法存在,则不需要init ...请纠正我,如果我错了..任何帮助表示赞赏.

das*_*ght 7

init方法是new在调用时调用的方法[self new].它基本上是一样的

_instance = [[CESettings alloc] init];
Run Code Online (Sandbox Code Playgroud)

但需要较少的输入,并避免硬编码CESettings类的名称.

实现单例的更好方法是使用dispatch_once,如下所示:

+ (CESettings*)sharedInstance
{
    static dispatch_once_t once;
    static CESettings *_instance;
    dispatch_once(&once, ^ { _instance = [self new]; });
    return _instance;
}
Run Code Online (Sandbox Code Playgroud)