Objective-C Singleton中的变量被重置

Sam*_*cer 0 variables singleton properties objective-c ios

我创建了一个Objective-C Singleton类.我在课堂上有一些属性,包括BOOL属性.由于一些奇怪的原因BOOL,我声明的变量在设置的范围之外"重置"为YES.

在Singleton类的头文件中,BOOL使用@property以下参数声明:

@property (nonatomic, assign, readonly) BOOL shouldCryptData;
Run Code Online (Sandbox Code Playgroud)

在实现中的Singleton类@interface中,我重新定义了相同的属性readwrite(因为我需要它只能读取到外部类,而是读取/写入我自己的).

@interface SingletonClassName ()
    @property (nonatomic, assign, readwrite) BOOL shouldCryptData;
@end
Run Code Online (Sandbox Code Playgroud)

BOOL在单例类的初始化期间设置该属性.我在其中一个init方法中设置它.有多种init方法可以指定是否应该加密数据 - 这只是设置位置的一个示例.只有一个我的init方法调用super,所有其他方法调用main init.

- (id)init {
    self = [super init];
    if (self) {
        // Brief setup code

        [self setShouldCryptData:NO]; // Have also tried using dot-notation and without *self*
        // I can confirm that the shouldCryptData property is NO (within the current scope) right after setting it in this method
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

现在,奇怪的是,当我尝试shouldCryptData从任何其他方法访问时,它总是返回YES.在明确将其设置为NO后,为什么会返回YES?

我没有以任何奇怪的方式访问它,就像这样:

if (self.shouldCryptData == YES) // Outside of the init method, this is ALWAYS true
Run Code Online (Sandbox Code Playgroud)

我知道我做错了什么,但我无法理解.我觉得单身人士对此有所了解,但我不确定.似乎Google和StackOverflow都没有任何答案.有任何想法吗?


编辑

单身实施:

//-------- Header ---------------------//

@interface SingletonClassName : NSObject

+ (SingletonClassName *)sharedManager;

@end

//-------- Implementation ------------//

@implementation
+ (SingletonClassName *)sharedManager {
    static SingletonClassName *sharedManager = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (sharedManager == nil) sharedManager = [[super allocWithZone:NULL] init];
    });

    return sharedManager;
}

+ (id)allocWithZone:(NSZone *)zone {
    return [self sharedManager];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}
Run Code Online (Sandbox Code Playgroud)

pau*_*kow 7

最简单的解释是你没有一个单例,你在一个实例上设置该属性,在另一个实例上读取它.

尝试NSLog(@"%p", self)使用您设置和访问属性的所有方法,并确保它们都是相同的.

添加:

这是我通常的单例逻辑:

+ (instancetype) sharedInstance {
    static MyClass *singleton;

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

    return singleton;
}
Run Code Online (Sandbox Code Playgroud)

[MyClass sharedInstance]在需要时调用.