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