我在我的 .h 文件中定义了这个 UIButton:
@property (nonatomic,strong) UIButton *loginButton;
- (void)LoginButtonPressed:(UIButton *)sender;
并在我的 .m 文件中创建它:
@synthesize loginButton;
loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
[loginButton setFrame:CGRectMake(150.0f, 131.0f, 105.0f, 35.0f)];
[loginButton setBackgroundImage:[UIImage imageNamed:@"black_button.png"] forState:UIControlStateNormal];
[loginButton setTitle:@"Login" forState:UIControlStateNormal];
[loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[loginButton addTarget:self action:@selector(LoginButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
- (void)LoginButtonPressed:(UIButton *)sender
{
[self CreateActivityIndicator];
[self performSelector:@selector(Login) withObject:nil afterDelay:0.5];
}
我有一个名为 login 的方法,在登录时我想从 superview 中删除登录按钮。
[self.loginButton removeFromSuperview];
但突然之间(截至昨天)我的应用程序开始崩溃并在此行抛出错误:
@property (nonatomic,strong) UIButton *loginButton;
Thread 1: EXC_BAD_ACCESS(code=1, address0x10000010)
为什么会这样?我该如何解决?我确实在昨天左右更改了我的登录方法以使用 AFNetworking,是这样吗?
以防万一,这是我的完整方法:
- (void)Login
{
NSString *rawString = [self.idTextField text];
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
[self.idTextField setText:[rawString stringByTrimmingCharactersInSet:whitespace]];
[userName UserLogin:self.idTextField.text andPassWordExists:self.passwordTextField.text completionHandler:^(id responseObject, NSError *error) {
if (responseObject) {
[self.idTextField removeFromSuperview];
[self.passwordTextField removeFromSuperview];
[self.loginButton removeFromSuperview];
self.idTextField = nil;
self.passwordTextField = nil;
self.loginButton = nil;
[self CreateMenu];
}else{
[self CustomAlert:@"Sorry Login Failed, User and/or Passsword Incorrect"];
}
}];
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
indicatorView = nil;
[loadingView removeFromSuperview];
loadingView = nil;
}
这是触发它的原因:
-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler
{
NSURL *url = [NSURL URLWithString:kIP];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
initWithRequest:request];
NSURLCredential *credential = [NSURLCredential
credentialWithUser:user
password:password
persistence:NSURLCredentialPersistenceForSession];
[operation setCredential:credential];
[[NSOperationQueue mainQueue] addOperation:operation];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completionHandler) {
completionHandler(responseObject, nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (completionHandler) {
completionHandler(nil, error);
}
}];
[operation start];
}
这是我的按钮与 2 个文本项一起添加到视图中的方式:
//add all controls to the loginView
[loginMenuView addSubview:self.idTextField];
[loginMenuView addSubview:self.passwordTextField];
[loginMenuView addSubview:self.loginButton];
更新
我能够通过执行以下操作来解决此问题:
从我的登录方法中取出self.loginButton = nil;
,所以它看起来像这样:
- (void)Login
{
NSString *rawString = [self.idTextField text];
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
[self.idTextField setText:[rawString stringByTrimmingCharactersInSet:whitespace]];
[userName UserLogin:self.idTextField.text andPassWordExists:self.passwordTextField.text completionHandler:^(id responseObject, NSError *error) {
if (responseObject) {
[self.idTextField removeFromSuperview];
[self.passwordTextField removeFromSuperview];
[self.loginButton removeFromSuperview];
self.idTextField = nil;
self.passwordTextField = nil;
//self.loginButton = nil;
[self CreateMenu];
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
indicatorView = nil;
[loadingView removeFromSuperview];
loadingView = nil;
}else{
[self CustomAlert:@"Sorry Login Failed, User and/or Passsword Incorrect"];
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
indicatorView = nil;
[loadingView removeFromSuperview];
loadingView = nil;
}
}];
}
[self.loginButton removeFromSuperview];
并self.loginButton = nil;
从我的viewWillDisappear
方法中取出,如下所示:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
userName = nil;
[[NSNotificationCenter defaultCenter]removeObserver:self];
[self.idTextField removeFromSuperview];
[self.passwordTextField removeFromSuperview];
//[self.loginButton removeFromSuperview];
[self.menu removeFromSuperview];
[logoutButton removeFromSuperview];
//set every control to nil
self.idTextField = nil;
self.passwordTextField = nil;
//self.loginButton = nil;
self.menu = nil;
menuItems = nil;
textfieldNavigatorView = nil;
}
这解决了我的问题,我只想知道这是否是最好的解决方案。