Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:单例返回null_Ios_Singleton - Fatal编程技术网

iOS:单例返回null

iOS:单例返回null,ios,singleton,Ios,Singleton,我有一个单例,我将数据传递给它,但它返回null。在我的情况下,你能帮助我吗。提前感谢:) 这是我的密码 卡片.h @property (weak,nonatomic) NSString *email; @property (weak,nonatomic) NSString *fName; @property (weak,nonatomic) NSString *lName; @property (weak,nonatomic) NSString *category; +(Card *)get

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

这是我的密码

卡片.h

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

+(Card *)getCard;
@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

@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;
}
Card *card = [Card getCard];
    [card setEmail:self.emailField.text];
    NSLog(@"%@",card.email);
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);
这是我的测试代码,看看它是否工作

测试.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;
}
Card *card = [Card getCard];
    [card setEmail:self.emailField.text];
    NSLog(@"%@",card.email);
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);
但是这个代码给我(null)

将其替换为此代码

static Card *instance;

 +(Card *) getCard
{
@synchronized (self)
{
    if(instance == nil)
    {
        instance = [[Card alloc]init];
    }
}
return instance;
}

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

在什么帮助下ḯ Sujjesu可以如下修改您的代码,因为 行
静态csCard*实例你正在使用
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);

   }

像这样修改您的类

卡片.h

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

+(Card *)getCard;
@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

@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;
}
Card *card = [Card getCard];
    [card setEmail:self.emailField.text];
    NSLog(@"%@",card.email);
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);
不需要重写init

在你的测试课上


它应该是work

Ok。现在在测试类中,您在哪个位置编写代码(例如:单击按钮)?我认为你正在用任何一种视图循环方法编写测试类的代码,即在viewDidLoad或ViewWillDisplay上,原因是当时textfield值将为null,因为用户没有输入值。谢谢!这么强是我唯一的问题:)顺便说一句,感谢setter和getter方法提示,它真的很有用:D+100000