【问题标题】:What is the use of init in this singleton class..?这个单例类中的init有什么用..?
【发布时间】:2013-05-16 10:27:11
【问题描述】:

@Interface

//
//  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

@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

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

【问题讨论】:

    标签: iphone ios objective-c singleton


    【解决方案1】:

    init 方法是 new 在调用 [self new] 时调用的方法。本质上是一样的

    _instance = [[CESettings alloc] init];
    

    但需要更少的输入并避免对 CESettings 类的名称进行硬编码。

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

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

    【讨论】:

    • 谢谢.. 忘了。 ://
    • @AnkitSrivastava 谢谢.. 忘了它。 ://
    【解决方案2】:

    来自NSObject的文档:

    + (id)new

    分配一个接收类的新实例,向它发送一个init 消息,并返回初始化的对象。

    您在单例创建者方法中调用[self new],这反过来会分配一个新实例并向其发送init 消息。

    【讨论】:

    • 谢谢..忘了。 ://
    【解决方案3】:

    sharedInstance 类方法只负责分配和初始化一个对象,然后总是返回它。

    但是

    你没有通过那个方法,你可以自己调用 alloc init,它也可以工作

    所以需要init来保持alloc/init应该如何工作的语义

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2012-06-30
      相关资源
      最近更新 更多