【问题标题】:Why does Xcode skip for loop code?为什么 Xcode 会跳过循环代码?
【发布时间】:2014-04-22 10:48:18
【问题描述】:

只想问initWithNibName这个方法结束了,logInIDArraypasswordArray属性会不会又变成nil了?

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
//sharedLogInDataBase returns singleton
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    BNRLogInDataBase *logInDatabase = [BNRLogInDataBase sharedLogInDataBase];
    logInDatabase.logInIDArray = [[NSMutableArray alloc]init];
    logInDatabase.passwordArray = [[NSMutableArray alloc]init];
}
return self;
}

这里是单例方法

+(instancetype)sharedLogInDataBase
{
static BNRLogInDataBase * database = nil;
if (!nil) {
    database = [[BNRLogInDataBase alloc]initPrivate];
    }
return database;
}

-(instancetype)init
{
    @throw [NSException exceptionWithName:@"Singleton" reason:@"use sharedLogInDataBase"              userInfo:nil];
}

-(instancetype)initPrivate
{
 self = [super init];

return self;
}

【问题讨论】:

  • 这取决于sharedLogInDataBase - 它真的返回一个单例实例吗?并显示您遇到问题的代码,并描述已完成的调试。
  • logInDatabase 对象指向单例对象,因此它将被保留!!!
  • 伙计,我知道问这个问题很愚蠢,因为每当我将对象添加到属性中时,每次添加时我仍然会得到 0 个对象或 1 个对象。
  • @Wain 这是代码 +(instancetype)sharedLogInDataBase { static BNRLogInDataBase * database = nil; if (!nil) { 数据库 = [[BNRLogInDataBase alloc]initPrivate]; } 返回数据库; }
  • 您应该考虑一下 BNRLogInDataBase 类的设计。在另一个类中实例化属性确实是一种不好的做法。

标签: ios methods


【解决方案1】:

你的方法应该是:

+ (instancetype)sharedLogInDataBase
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

目前您的 if (!nil) 没有按照您的预期进行...

然后,您的 init 方法应该调用您的 initPrivate 方法。

【讨论】:

  • 等等,但是根据大书呆子牧场的说法,这就是本书实现单例方法的方式。你是什​​么意思我的 if(!nil) 不能使用 static 保持对象活着吗?我也试试你的方法!
  • nil 等效于该语句中的 false / NO。所以你说的是if (!NO),即if (YES),所以你总是在执行并返回一个新实例。 dispatch_once 方法更好+更安全
【解决方案2】:

它们不能变为 nil,因为您实例化了它们。虽然它们将是空的。

【讨论】:

  • 我很难做到这一点,因为当我尝试将对象添加到两个属性中时,即使添加后它们仍然为零。你能帮我解决这个问题吗?
  • 你确定 logInDatabase 真的是一个单例对象吗?因为如果不是,那么您使用的局部变量将在初始化后消失。确保你真的有一个 logInDatabase 对象。
  • 请检查那里的代码我不确定我只是iOS编程的新手。
  • 我实际上是对的 :) - 你的单身人士并不是真正的单身人士)
  • 是的,哈哈,我应该用 !variable 替换 !nil,谢谢!
【解决方案3】:

这取决于:

  • 您是如何实现 BNRLogInDataBase 单例的,如果您使用强引用来保留单例实例,logInDatabase 将保留,否则将被释放

  • 您如何声明 logInIDArraypasswordArray 属性,如果强则只要 logInDatabase 存在,它们就会一直存在,如果弱,它们将变为 nil

if (!nil) {
    database = [[BNRLogInDataBase alloc]initPrivate];
}

检查你的测试,nil 总是false,所以!nil 总是true,每次你调用你的单例你都会得到一个不同的对象!

【讨论】:

  • 请检查那里的代码我已经上传了我的单例方法的实现
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 2015-06-03
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多