我知道标题可能听起来有点奇怪,但问题也是如此。
我几乎在整个开发过程中一直在模拟器上测试我的应用程序,我确实在真实设备上测试过一段时间才确定。 但现在我已接近完成问题了。
每当我进行登录时,我的整个应用程序崩溃,说用户名和密码变量已被解除分配......
以下是我的申请流程:
打开应用程序时,它会检查用户名和密码是否已保存或注意
- (void)checkIfPreviouslyLoggedIn:(BOOL)didLogin andLogin:(BOOL)doLogin {
// some logic to get it out of the keychain
NSLog(@"checkIfPreviouslyLggedIn: ACCOUNT %@ / %@", tmpUsername, tmpPassword);
// RETURN: checkIfPreviouslyLggedIn: ACCOUNT /
}
之前没有保存任何内容,没什么大不了的,用户只需输入帐户并按登录
- (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被取消分配,即使在实际通话之前我也检查了用户名和密码,它们仍然没问题。
所以不知何故(神奇地)那两个变量没有任何理由被解除分配。 请注意,_username和_password仅在loginWithUsername中设置,它们不会在我的应用程序中的任何位置更改。
2012-06-04 13:33:28.001 coop [5060:707] * - [CFString respondsToSelector:]:发送到解除分配的实例0x1099fc40的消息 2012-06-04 13:33:28.648 coop [5060:707] * - [CFString _cfTypeID]:消息发送到解除分配的实例0x1099fc40
导致这种情况的原因是,我添加了多个断点,只是意识到在调用和loginCheck()之间的某个地方它们会消失。
答案 0 :(得分:1)
问题在于:
// save it for later use
_username = username;
_password = password;
您的变量_username
和_password
未被保留,这就是他们获得自动释放的原因。
在NON-ARC案例中,将其声明为@property(retain)
,对于ARC,@property(strong)
使用:
self._username = username;
self._password = password;
现在你拥有了内存的所有权,现在你必须在完成时释放它。
答案 1 :(得分:1)
请检查您是如何在头文件中声明属性(_username和_password)的。如果它没有被声明为
@property (nonatomic, retain) NSString * _username;
@property (nonatomic, retain) NSString * _password;
然后您的属性将被自动释放。因此,稍后当您尝试访问此属性时,您会收到已取消分配的消息。
此外,当您将变量声明为头文件中的属性时,请使用“self”访问它们。
请在完成属性后取消分配您的属性,无需再访问此属性。
如果需要更多帮助,请告诉我相同的