2012-06-04 29 views
0

我知道标题听起来可能有点不可思议,但同样适用于这个问题。可变突然撤掉

我一直在测试我的应用程序在模拟器上几乎是在发展的整个时间,我没有在真实的设备上,而一次测试,以确保公正。 但现在我已经接近完成一个问题了。

每当我大跳登录,我的整个应用程序崩溃说的用户名和密码变量被释放......

这里是我的应用程序的流程:

当打开的应用程序,它会检查用户名和密码被保存或注意

- (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将被释放,即使实际调用之前我的权利检查用户名和密码,他们仍然没问题。

所以不知何故(神奇)的2个变量得到了释放,没有任何理由。 注意_username和_password在loginWithUsername唯一一套,他们没有在任何地方我的应用程序更改。

2012-06-04 13:33:28.001鸡舍[5060:707] * - [CFString字符串respondsToSelector:]:消息发送到释放的实例0x1099fc40 2012-06-04 13:33:28.648鸡舍[ 5060:707] * - [CFString字符串_cfTypeID]:消息发送到释放实例0x1099fc40

什么原因可能造成这一点,我添加了多个断点,才意识到呼叫和loginCheck(),他们消失之间的某处。

回答

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; 

现在你自己的内存的所有权,现在你必须释放它时,你就大功告成了。

+0

这确实是问题的任何更多的帮助,这事模拟器以不同方式处理?那里我从来没有遇到任何问题。 –

1

请检查你是如何在你的头文件中声明你的属性(_username和_password)的。如果它没有声明为

@property (nonatomic, retain) NSString * _username; 
@property (nonatomic, retain) NSString * _password; 

那么你的属性会得到autoreleased。因此,稍后当您尝试访问此属性时,您会收到他们释放的消息。

此外,当您将变量声明为头文件中的属性时,请使用“self”进行访问。

请您在取消分配属性后才能取消分配属性,不需要再访问此属性。

请让我知道是否有需要在同一