Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.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 变量失去其分配_Ios_Objective C_Cocoa - Fatal编程技术网

Ios 变量失去其分配

Ios 变量失去其分配,ios,objective-c,cocoa,Ios,Objective C,Cocoa,我不明白为什么我会出现这个错误,希望能得到一些指导 我正在viewDidLoad方法中设置一个变量,NSLog将从_myUser.email和_myUser返回预期结果 现在,当我在任何IBActionmethod中调用_myUser变量时,它总是会使应用程序崩溃。我想是因为它失去了它。否则,我无法解释为什么在其他地方执行时会导致应用程序崩溃。但话说回来。。。我正在尽我所能确保变量在整个应用程序中可用和设置 我已经在应用程序中搜索过了,我唯一设置我的用户的地方是在viewDidLoad中,所以我

我不明白为什么我会出现这个错误,希望能得到一些指导

我正在viewDidLoad方法中设置一个变量,NSLog将从_myUser.email和_myUser返回预期结果

现在,当我在任何IBActionmethod中调用_myUser变量时,它总是会使应用程序崩溃。我想是因为它失去了它。否则,我无法解释为什么在其他地方执行时会导致应用程序崩溃。但话说回来。。。我正在尽我所能确保变量在整个应用程序中可用和设置

我已经在应用程序中搜索过了,我唯一设置我的用户的地方是在viewDidLoad中,所以我不会在其他任何地方设置它

编辑:如果我从ViewDidLoad的最末端调用[self myOtherMethod],NSLog将工作,但不会从任何其他方法内部工作

edit2当我做完全相同的事情时,它在应用程序的另一部分工作

用户是NSManagedObject对象 Model是一个NSObject,其中包含所有模型查询

崩溃是一个简单的lldb


特别是对于新的Objective-C程序员来说,一个不错的经验法则是始终使用属性而不是实例变量,并且只引用getter和setter中的_instanceVariable

在未立即向结果发送init或其任何变体消息之前,切勿调用[SomeClass alloc]。已分配但未初始化的对象是危险的;当你尝试使用它时,任何事情都可能发生

在这段代码中,这没有任何区别,因为您会立即将刚创建但未初始化的用户对象替换为从[\u model getCurrentUser]获得的用户对象

变量和对象是两个不同的东西。变量是您在其中声明此属性的任何对象的一部分,看起来像某种视图控制器,并且是一个容器,其中包含对另一个对象的引用,该对象是您从模型中获取的用户对象。变量不是“失去其分配”;用户对象是

这也是为什么说这样的话毫无意义:

_myUser = [[User alloc] init]; //This statement is unnecessary!
_myUser = [_model getCurrentUser];
第一行创建了一个与任何事情都无关的新用户对象,并将对该对象的引用存储在_myUser变量中,第二行随后立即将对该对象的引用替换为对不同用户对象的引用,即从模型中获得的“当前用户”。一个变量,两个对象

崩溃是一个简单的lldb

“lldb”不是一种崩溃;这是调试器的提示。您需要查看提示符上方,以查看它是何种崩溃

查看导航器中的堆栈跟踪,并查看崩溃发生在代码的哪一行,也可能会有所帮助

[添加]或在提示中键入bt,如果导航器中没有任何内容。显然,根据我所看到的几个其他问题,LLDB在没有Xcode注意到的情况下启动是一个从10.8.4开始出现的bug

最后的那个人耍了个花招

那你就不用ARC了。您不能在ARC下发送retain消息,因此,如果您可以发送retain消息并且构建成功,则证明您没有使用ARC

这反过来也说明了问题所在:您将从getCurrentUser获得的用户对象分配给了实例变量,但由于您没有保留它或将它分配给强属性,它在您的下方消失了,并且由于您仍然保留着它,所以在稍后尝试使用该死对象时崩溃了

我建议打开ARC。这样,您就不需要或无法保留该对象;只需将其分配给一个实例变量,如_myUser,就可以使对象保持活动状态


另一种选择是,您选择的解决方案是自己保留对象;另一种方法是将对象分配给myUser属性self.myUser,而不是_myUser实例变量。只要不使用ARC,仅指定实例变量不会保留对象;分配一个强属性,就像保留对象本身一样。

你能发布控制台在崩溃时说了什么吗?@CodaFi我把Alloc作为一种方式,看看是不是缺少它导致了问题,@Chuck是的,我正在使用的是,LLDB不是很有用。崩溃点是nslog中的_myUser的执行点。您不需要第[User alloc]行,因为您正在下一行中用[_modelgetcurrentuser]重写该变量。另外,如果要使用_myUser实例变量,则应使用@synthesis myUser=\u myUser;合成属性;。两个问题:1如果您将myOtherMethod更改为NSLog@Second:%@,我的用户,这是否仍然中断?2您能确保电子邮件是用户对象的强属性吗?self.\u myUser是错误的。。。self.myUser是正确的方法。。。。。但是无论如何。。最后的retain成功了…\u myUser=[[\u model getC
当前用户]保留]@乔纳森:你说你在用ARC。如果你能编译这段代码,你就不会使用ARC。正如提问者所说,self.\u myUser是错误的;属性名为myUser,实例变量名为_myUser,self…访问属性,而不是直接访问实例变量。后一个例子是正确的,但前者需要少一个下划线。它还需要少一条retain消息:当您分配给强属性时,该属性的setter方法将保留该对象。事先保留意味着它会被保留两次,因此会被泄露。我认为这是错误的想法。属性是并且一直是IVAR的包装器,IVAR只是内部结构中的内存偏移量。初学者应该知道这一点,并理解作业的后果,而不是假设二传手会挥手和变魔术。
- (void)viewDidLoad
{

    [super viewDidLoad];

    _model = [[model alloc]init];

    self._myUser = [[_model getCurrentUser] retain];

     NSLog(@"First: %@",self._myUser.email);
}
- (void) myOtherMethod {
NSLog(@"Second: %@",self._myUser.email);
}
- (void)viewDidLoad
    {

        [super viewDidLoad];

        _model = [[model alloc]init];

        _myUser = [[_model getCurrentUser] retain]; // or copy if you owerdrive copyWithZone: metod

         NSLog(@"First: %@",_myUser.email);
    }
    - (void) myOtherMethod {
    NSLog(@"Second: %@",_myUser.email);
    }
_myUser = [User alloc]; // I can do this or not do it and it gives me the same result
_myUser = [_model getCurrentUser];
_myUser = [[User alloc] init]; //This statement is unnecessary!
_myUser = [_model getCurrentUser];