[英]iOS: Singleton returning null
我有一个单例,并且将数据传递给它,但它返回null,请您在我的情况下为我提供帮助。 提前致谢 :)
这是我的代码
Card.h
@property (weak,nonatomic) NSString *email;
@property (weak,nonatomic) NSString *fName;
@property (weak,nonatomic) NSString *lName;
@property (weak,nonatomic) NSString *category;
+(Card *)getCard;
Card.m
@synthesize email;
@synthesize fName;
@synthesize lName;
@synthesize category;
static csCard *instance;
+(Card *) getCard
{
@synchronized (self)
{
if(instance == nil)
{
instance = [[Card alloc]init];
}
}
return instance;
}
- (id) init{
self.email = [[NSUserDefaults standardUserDefaults]stringForKey:@"email"];
self.fName = [[NSUserDefaults standardUserDefaults]stringForKey:@"firstName"];
self.lName = [[NSUserDefaults standardUserDefaults]stringForKey:@"lastName"];
self.category = @"TestCategory";
return self;
}
这是我的测试代码,看它是否有效
Test.m
Card *card = [Card getCard];
[card setEmail:self.emailField.text];
NSLog(@"%@",card.email);
但是这段代码给我(空)
像这样修改您的课程。
Card.h
@property (strong,nonatomic) NSString *email; //Let the modal be strong property
@property (strong,nonatomic) NSString *fName;
@property (strong,nonatomic) NSString *lName;
@property (strong,nonatomic) NSString *category;
+(Card *)getCard;
Card.m
static Card *instance;
+(Card *) getCard
{
@synchronized (self)
{
if(instance == nil)
{
instance = [[Card alloc]init];
}
}
return instance;
}
- (NSString)email{
return [[NSUserDefaults standardUserDefaults]stringForKey:@"email"];
}
- (void)setEmail:(NSString)email{
[[NSUserDefaults standardUserDefaults] setString:email forkey:@"email"];
}
无需覆盖init
在你的测试课中
Card *card = [Card getCard];
[card setEmail:self.emailField.text];
NSLog(@"%@",card.email);
static csCard *instance;
+(csCard *) getCard
{
@synchronized (self)
{
if(instance == nil)
{
instance = [[csCard alloc]init];
}
}
return instance;
}
用此代码替换
static Card *instance;
+(Card *) getCard
{
@synchronized (self)
{
if(instance == nil)
{
instance = [[Card alloc]init];
}
}
return instance;
}
实例对象的类名称错误,在单例方法中,返回数据类型也错误。 我想你会明白我的意思。
借助βhargavḯsujjested的帮助,您可以按如下方式修改您的代码,因为该行中的static csCard *instance;
您正在使用csCard
我认为这是拼写错误,因此您可以做得更好,
#import "Card.h"
static dispatch_once_t onceDispach;
@implementation Card
@synthesize email = _email;
@synthesize fName;
@synthesize lName;
@synthesize category;
static Card *instance = nil; //change this to Card because this instance which is of type Card
+(Card *)getCard
{
dispatch_once(&onceDispach, ^{
instance = [[self alloc] init];//careate Card shared object named instance
});
return instance;
}
- (id) init
{
self.email = [[NSUserDefaults standardUserDefaults]stringForKey:@"email"];
self.fName = [[NSUserDefaults standardUserDefaults]stringForKey:@"firstName"];
self.lName = [[NSUserDefaults standardUserDefaults]stringForKey:@"lastName"];
self.category = @"TestCategory";
return self;
}
@end
- (NSString *)email
{
return _email;
}
- (void)setEmail:(NSString *)email
{
_email = email;
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:email forKey:@"email"];
}
在您正在使用此共享实例的类中,如下所示
- (void)actionMathodCalled
{
Card *card = [Card getCard];
NSLog(@"before saving to defaults->%@",card.email);
[card setEmail:@"happyCoding@ymail.com"];
NSLog(@"after savng to defaults->%@",card.email);
}
+ (Card *)instance {
static Card *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[Card alloc] init];
});
return sharedInstance;
}
应该工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.