无法在另一个视图iOS中的Singleton类中设置NSString

时间:2013-04-15 19:15:54

标签: ios uiviewcontroller nsstring singleton

我有一个单例,它有一个名为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]);

1 个答案:

答案 0 :(得分: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,如{{ 1}}。