繁体   English   中英

iOS:单例返回null

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM