2

我对 iOS 5 单例有点陌生,并且正在使用此处记录的单例:

iOS 5 单例

像这样的东西:

我的经理.h

#import <Foundation/Foundation.h>
@interface MyManager : NSObject

//Data for section 1
@property(nonatomic,copy) NSString * section1a;
@property(nonatomic, assign) NSUInteger section1b;


//Data for section 2
@property(nonatomic,copy) NSString * section2a;
@property(nonatomic, assign) NSUInteger section2b;

+ (id)sharedInstance;
@end

我的经理.m

@implementation MyManager
@synthesize section1a, section1b, section2a; , section2b;

+ (id)sharedInstance
{
    static dispatch_once_t pred = 0;
    __strong static id _sharedObject = nil;
    dispatch_once(&pred, ^{
        _sharedObject = [[self alloc] init]; // or some other init method
    });
    return _sharedObject;
}
@end

所以我使用它如下:

MyManager * myManager = [MyManager sharedInstance];
myManager.data = self.data

这是您通常使用单例的方式吗?我错过了什么吗?对不起,我只是想确保我做对了一些基本问题。

谢谢

4

4 回答 4

1

这不是单例,因为您可以使用 alloc/init 方法创建此类的多个实例。正确答案在这里

于 2012-07-19T15:45:50.160 回答
1

你做对了。这是(目前:) 的方式,并且在启用 ARC、多线程等情况下工作正常。

它不是严格意义上的单例,因为您可以分配更多的类实例,但我认为这与您的情况无关。

于 2012-07-19T15:55:42.933 回答
0

我通常这样制作我的单身人士(假设我们正在为 Manager 制作单身人士):

static (Manager *) instance;

+ (Manager *) getInstance
{
    if(!instance) instance = [[Manager alloc] init];
    return instance;
}

这是一个非常基本的单例(它没有考虑多线程或其他高级特性),但这是基本格式。

于 2012-07-19T15:46:34.563 回答
0

请参考:iOS 5 中的单例?您应该覆盖 allowWithZone 以防止恶意代码创建新实例。

于 2012-07-31T19:53:37.950 回答