取消分配了类UITextField的实例,而键值观察者仍在其中注册。

时间:2014-06-18 11:40:52

标签: uitextfield key-value-observing ios7.1

您好我收到此错误

  

类UITextField的实例0x18872c0已取消分配,而键值观察者仍在其中注册。观察信息被泄露,甚至可能被错误地附加到其他物体上。在NSKVODeallocateBreak上设置一个断点,在调试器中停止。

我正在观察在ViewDidLoad

中的文本字段上所做的更改
    [textNumber addObserver:self forKeyPath:@"text" options:0 context:nil];

这在这里回应

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                    change:(NSDictionary *)change context:(void *)context {


if (textNumber.text.length==0) {
    [buttonMakeAudioCall setImage:[UIImage imageNamed:@"off_green_btn.png"] forState:UIControlStateNormal];
    buttonMakeAudioCall.userInteractionEnabled=NO;

}else{
    [buttonMakeAudioCall setImage:[UIImage imageNamed:@"green_btn.png"] forState:UIControlStateNormal];
    buttonMakeAudioCall.userInteractionEnabled=YES;
}

}

不幸的是,当响应来临时,app会在以下方法内崩溃。

 NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response,
                                           NSData *data, NSError *connectionError)
 {
     if (data.length > 0 && connectionError == nil)
     {
         NSDictionary *greeting = [NSJSONSerialization JSONObjectWithData:data
                                                                  options:0


                                                                    error:NULL];

         NSString *balance = [greeting objectForKey:@"balance"];
         NSLog(@"balance is %@",balance);
         labelStatus.text=[NSString stringWithFormat:@"%@€",balance];

     }
 }];

我理解的是文本字段对象/观察者在某个时刻被释放,我需要处理它。但是如何?我正在使用ARC。如果知道更好的人可以提供有关情况的更多信息,我可以处理它。 / p>

1 个答案:

答案 0 :(得分:0)

我找到了原因。这是我身边的一个错误。在进入这个视图控制器之前,我正在调用一个方法。在那里我写下面的代码。

 NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response,
                                           NSData *data, NSError *connectionError)
 {
     if (data.length > 0 && connectionError == nil)
     {
         NSDictionary *greeting = [NSJSONSerialization JSONObjectWithData:data                                                                     options:0                                                      error:NULL];
         NSString *sipserver = [greeting objectForKey:@"ip"];
         NSString *port = [greeting objectForKey:@"port"];
         NSString *control_url = [greeting objectForKey:@"control_url"];
         NSString *version = [greeting objectForKey:@"version"];



         [[NSUserDefaults standardUserDefaults] synchronize];
         [self.navigationController popViewControllerAnimated:YES];
         [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"login"];

问题在于这一行。

         [self.navigationController popViewControllerAnimated:YES];

我弹出当前视图控制器的父视图控制器。因为我已经使用了块,这就是这样的。无论如何我找到了解决方案。这与textfield或key value observer无关。希望如此答案有帮助。谢谢。