-1

我有一个单例,它有一个名为 duration 的属性字符串并且是合成的。

MySingleton.h

@property(nonatomic, strong)NSString *duration

MySingleton.m

@synthesize duration;

+ (id)sharedManager {
static MySingleton *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}

- (id)init {
if (self = [super init]) {

    duration = @"Default Property Value";
}
return self;
}

我在上面设置了字符串初始值。这一切都很好。现在从下面的另一个viewController view1我有一个方法,我想在其中将Singleton中的持续时间字符串更新为另一个值,如下所示它正确执行

- (void)updateString
{

MySingleton *singleton = [MySingleton sharedManager];
singleton.duration = @"abc";
}

现在从第二个角度来看,如果我调用 [sharedManager duration]; 它得到的初始设置值不是我从 view1 设置的那个应该说@“abc”;在我调用的第二个视图的 viewDidLoad

sharedManager = [[MySingleton alloc]init];
NSLog (@"The duration??? = %@", [sharedManager duration]);
4

1 回答 1

1

您的测试代码是错误的,如下代码所示,它允许您更改字符串。也许您没有将您的单例称为[MySingleton sharedManager],而是您正在调用[MySingleton new].

#import <Foundation/Foundation.h>

@interface MySingleton : NSObject
@property (nonatomic, copy) NSString *duration;
@end

@implementation MySingleton

+ (instancetype) sharedManager {
    static MySingleton *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [self new];
    });
    return sharedMyManager;
}

- (id)init {
    self = [super init];
    if (self) {
        _duration = @"Default Property Value";
    }
    return self;
}

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        [MySingleton sharedManager].duration = @"abc";
        NSLog(@"%@",[MySingleton sharedManager].duration); // abc
    }
}

另外,请注意@property NSString 应该是副本,而不是强,并且不需要@synthesize(默认添加@synthesize varname = _varname),并且setter 有一个小写的s,如setDuration:.

于 2013-04-15T19:24:11.250 回答