Ios 变量突然删除

Ios 变量突然删除,ios,dealloc,Ios,Dealloc,我知道标题听起来有点奇怪,但问题也是如此 在开发过程中,我几乎一直在模拟器上测试我的应用程序,我偶尔会在真实的设备上测试一次,以确保安全。 但现在我快完成了,出现了一个问题 每当我进行登录时,我的整个应用程序都会崩溃,说用户名和密码变量被释放了 以下是我的应用程序流程: 打开应用程序时,它会检查用户名和密码是否已保存或记录 - (void)checkIfPreviouslyLoggedIn:(BOOL)didLogin andLogin:(BOOL)doLogin { // some

我知道标题听起来有点奇怪,但问题也是如此

在开发过程中,我几乎一直在模拟器上测试我的应用程序,我偶尔会在真实的设备上测试一次,以确保安全。 但现在我快完成了,出现了一个问题

每当我进行登录时,我的整个应用程序都会崩溃,说用户名和密码变量被释放了

以下是我的应用程序流程:

打开应用程序时,它会检查用户名和密码是否已保存或记录

- (void)checkIfPreviouslyLoggedIn:(BOOL)didLogin andLogin:(BOOL)doLogin {
     // some logic to get it out of the keychain
     NSLog(@"checkIfPreviouslyLggedIn: ACCOUNT %@ / %@", tmpUsername, tmpPassword);

     // RETURN: checkIfPreviouslyLggedIn: ACCOUNT  /
}
之前没有保存任何内容,没有什么大不了的,用户只需输入帐户并按login

- (void)loginWithUsername:(NSString *)username andPassword:(NSString *)password {
      NSLog(@"loginWithUsername: ACCOUNT %@ / %@", username, password);
      // RETURN: loginWithUsername: ACCOUNT testUser / password

      // save it for later use
      _username = username;
      _password = password;

      NSLog(@"loginWithUsername: ACCOUNT %@ / %@", _username, _password);
      // RETURN: loginWithUsername: ACCOUNT testUser / password

      // Attach a notification handler
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginCheck:) name:@"LoginCheck" object:nil];

      // call the web API
      [self doRequestFromLocation:@"/groups" withPostType:@"GET" andData:nil whichTriggersNotification:@"LoginCheck"];
}
很酷,用户名和密码都被很好地记录了下来,到目前为止还不错,doRequestFromLocation基本上是一个队列类型的东西,我可以发送任意多个请求,它会逐个处理它们

- (void)doRequestFromLocation:(NSString *)location withPostType:(NSString *)type andData:(NSData *)data whichTriggersNotification:(NSString *)notification {
      NSLog(@"doRequestFromLocation: ACCOUNT %@ / %@", _username, _password);
      // RETURN: doRequestFromLocation: ACCOUNT testUser / password
} 
然后它转到一个doRequest方法,该方法执行实际的数据请求,我再次在那里记录我的用户名,它返回正确的用户名

NSLog(@"doRequest: ACCOUNT %@ / %@", _username, _password);
在这之后,一切都变得非常糟糕,当请求完成时,就会调用loginCheck()

- (void)loginCheck:(NSNotification *)notification {
    NSLog(@"loginCheck: ACCOUNT %@ / %@", _username, _password);
}
在这里,我的_用户名和_密码被解除分配,甚至在实际通话之前,我检查用户名和密码,它们仍然很好

所以不知何故(神奇地)这两个变量毫无理由地被释放了。 请注意_username和_password仅在loginWithUsername中设置,它们不会在我的应用程序中的任何地方更改

2012-06-04 13:33:28.001合作[5060:707]*-[CFString respondsToSelector:]:消息发送到解除分配的实例0x1099fc40 2012-06-04 13:33:28.648 coop[5060:707]*-[CFString\u cfTypeID]:发送到解除分配实例0x1099fc40的消息

造成这种情况的原因是什么,我添加了多个断点,但却发现在调用和loginCheck()之间的某个地方,断点消失了。

问题在于:

 // save it for later use
      _username = username;
      _password = password;
您的变量
\u用户名
\u密码
不会被保留,这就是它们自动删除的原因

在非ARC情况下,将它们声明为
@property(retain)
,对于ARC,将它们声明为
@property(strong)
使用:

self._username = username;
self._password = password;

现在你拥有了内存的所有权,现在你必须在完成后释放它。

请检查你是如何在头文件中声明属性的(\u用户名和\u密码)。如果未声明为

@property (nonatomic, retain) NSString * _username;
@property (nonatomic, retain) NSString * _password;
然后,您的属性将自动删除。所以,稍后当您尝试访问此属性时,您会收到一条消息,表明它们已解除分配

另外,当您在头文件中将变量声明为属性时,请使用“self”访问它们

请仅在处理完您的属性后解除分配,不需要进一步访问此属性


如果在同一个问题上需要更多帮助,请告诉我,这确实是问题所在,这是模拟器处理不同的问题吗?我在那里从来没有遇到过任何问题。