iOS:返回空值的单例



我有一个单例,我向它传递数据,但它返回 null,你能在我的情况下帮助我吗?提前致谢:)

这是我的代码

卡.h

@property (weak,nonatomic) NSString *email;
@property (weak,nonatomic) NSString *fName;
@property (weak,nonatomic) NSString *lName;
@property (weak,nonatomic) NSString *category;
+(Card *)getCard;

卡·米

@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;
}

这是我的测试代码,看看它是否有效

测试.m

Card *card = [Card getCard];
    [card setEmail:self.emailField.text];
    NSLog(@"%@",card.email);

但是这段代码给了我(空)

像这样修改你的类。

卡.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;

卡·米

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"];
}

无需覆盖初始化

在您的测试类中

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;
}

实例 Object 的类名错误,在单例方法中,返回数据类型也是错误的。我想你会明白我在说什么。

+ (Card *)instance {
    static Card *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Card alloc] init];
    });
    return sharedInstance;
}

应该是工作

在 βhargavḯ sujjest 的帮助下,您可以按如下方式修改代码,因为在您使用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);
   }

最新更新