我有一个用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
非常感谢任何帮助。
答案 0 :(得分:4)
您在许多方面偏离了普遍接受的规则。
一。使用dispatch_once创建单身人士。 (适当填写详细信息; Xcode将帮助您)。
+ (MySingleton*)singleton {
static MySingleton* singleton;
dispatch_once (^{ singleton = [[MySingleton alloc] init]; });
return singleton;
}
两个。在init中没有奇怪的东西。这是一个单身人士。任何调用alloc / init的人都会获得他们应得的。
三。不要使用与属性具有相同名称的实例变量。没有声明私有实例变量,没有@synthesize。实例变量将以_开头。
四个。不要相信调试器。使用NSLog。