为什么Objective-C ++单身人士的道具无法设定?

时间:2015-12-04 17:06:21

标签: objective-c objective-c++

我有一个用Objective-C编写的单例类。其目的是保持国家。

如果我将其编译为Objective-C代码(实现在.m文件中),则init方法成功设置所有道具的默认值。

但是如果我将实现文件重命名为.mm并将其编译为Objective-C ++,我清楚地看到使用调试器的步骤,可以在init方法中设置道具。

以下是标题:

// State.h

#import <Foundation/Foundation.h>

@interface State : NSObject {
    @private
        SomeType* someObject;
        int someNumber;
}

@property (nonatomic, retain) SomeType* someObject;
@property int someNumber;

+ (State*)singleton;

@end

这是实施:

// State.mm

#import "State.h"

static State* singleton = nil;


@implementation State

@synthesize someObject = someObject,
            someNumber = someNumber;

+ (State*)singleton {
    @synchronized([State class]) {
        if (!singleton) {
            singleton = [[self alloc] init];
        }
        return singleton;
    }
    return nil;
}

- (id)init {
    if ( singleton != nil ) {
        return singleton;
    }

    if (self = [super init]) {
        someObject = NULL;
        someNumber = 44100;
    }
    return self;
}

@end

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您在许多方面偏离了普遍接受的规则。

一。使用dispatch_once创建单身人士。 (适当填写详细信息; Xcode将帮助您)。

+ (MySingleton*)singleton {
    static MySingleton* singleton;
    dispatch_once (^{ singleton = [[MySingleton alloc] init]; });
    return singleton; 
}

两个。在init中没有奇怪的东西。这是一个单身人士。任何调用alloc / init的人都会获得他们应得的。

三。不要使用与属性具有相同名称的实例变量。没有声明私有实例变量,没有@synthesize。实例变量将以_开头。

四个。不要相信调试器。使用NSLog。