2

我目前正在为我的应用程序编写一个助手类。助手类将返回全局可访问的变量。我创建了一个简单的助手,如下所示:

@interface MyHelper : NSObject
{

}

+(id) sharedHelper;

+(NSMutableArray *) employers;


+(id) sharedHelper
{
    static MyHelper *sharedHelper = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{

        sharedHelper = [[self alloc] init];
    });

    return sharedHelper;
}

+(NSMutableArray *) employers
{
    return _employers; 
}

现在我可以像这样访问雇主:

[MyHelper employers]我也可以像这样访问它[[MyHelper sharedHelper] employers]每种方法的好处是什么,或者它们都相同。

4

2 回答 2

2

我想雇主数组是您的 MyHelper 类的属性。

如果您在不调用 [MyHelper sharedHelper] 的情况下调用 [MyHelper 雇主],您可能会得到不正确的结果(雇主数组的值是垃圾)。

也许这里的最佳实践是在 +(NSMutableArray *) 雇主中使用延迟加载并从 +(id) sharedHelper 中获取静态变量:

static MyHelper *sharedHelper = nil;
static dispatch_once_t onceToken;

+(id) sharedHelper
{
    dispatch_once(&onceToken,^{

        sharedHelper = [[self alloc] init];
    });

    return sharedHelper;
}

+(NSMutableArray *) employers
{
    if(!sharedHelper)
        [MyHelper sharedHelper]; 

    return _employers; 
}
于 2013-04-15T15:22:59.477 回答
0

employers的类方法正在引用_employers,这可能是您的类的实例变量。你不能这样做。此外,即使你做了一些草率的解决方法,比如全局变量,你也不能保证_employers已经实例化,除非employers类方法也确保sharedHelper调用了。

所以,有几个想法:

  1. 你真的应该有一些类属性employers(我假设你有,但为简洁起见省略了它,但让我们在此处包含它以消除歧义):

    @interface MyHelper : NSObject
    
    @property (nonatomic, strong) NSMutableArray *employers;
    
    @end
    
  2. 我想你的init方法会初始化这个employers对象

    - (id)init
    {
        self = [super init];
        if (self) {
            _employers = [[NSMutableArray alloc] init];
        }
        return self;
    }
    
  3. 您现有的sharedHelper方法非常好。

  4. 但是,如果您要使用employers类方法,则应访问employers实例方法:

    + (NSMutableArray *)employers
    {
        return [[MyHelper sharedHelper] employers];
    }
    

完成所有这些后,您的课程将如下所示:

@interface MyHelper : NSObject

@property (nonatomic, strong) NSMutableArray *employers;

+ (id)sharedHelper;
+ (NSMutableArray *)employers;

@end

@implementation MyHelper

+ (id)sharedHelper
{
    static MyHelper *sharedHelper = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{
        sharedHelper = [[self alloc] init];
    });

    return sharedHelper;
}

- (id)init
{
    self = [super init];
    if (self) {
        _employers = [[NSMutableArray alloc] init];
    }
    return self;
}

+ (NSMutableArray *)employers
{
    return [[MyHelper sharedHelper] employers];
}

@end

这行得通,但话虽如此,但就风格而言,我个人不推荐使用类方法,employers如果您有一个用于同名属性的 getter 方法。似乎有点混乱。我将删除employers该类方法,并坚持使用将为您合成的标准 getter 方法,从而得到:

@interface MyHelper : NSObject

@property (nonatomic, strong) NSMutableArray *employers;

+ (id)sharedHelper;

@end

@implementation MyHelper

+ (id)sharedHelper
{
    static MyHelper *sharedHelper = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{
        sharedHelper = [[self alloc] init];
    });

    return sharedHelper;
}

- (id)init
{
    self = [super init];
    if (self) {
        _employers = [[NSMutableArray alloc] init];
    }
    return self;
}

@end

然后使用这个类的其他代码MyHelper可以简单地引用[[MyHelper sharedHelper] employers]自己。

于 2013-04-15T17:40:58.303 回答