0

我似乎无法弄清楚如何解决我收到的这个错误。我单击一个单元格,它将一个新的 UITableViewController 弹出到堆栈中。在此控制器中单击导航 UI 上的后退按钮后,我在调试器中收到此错误,但应用程序似乎没有任何问题,因为它不会崩溃或挂起并且仍然可以正常工作。

UITableView 类的实例 0x79a8400 已被释放,而键值观察者仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象上。在 NSKVODeallocateBreak 上设置断点以在调试器中停止。这是当前的观察信息:(上下文:0x0,属性:0x738c010>)

代码如下,我在其他 UITableViewControllers 上使用了类似的代码,但没有收到错误。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
    {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view.
    pull = [[PullToRefreshView alloc] initWithScrollView:(UIScrollView *) self.tableView];
    [pull setDelegate:self];
    [self.tableView addSubview:pull];
    [tableView.dataSource self];
    [tableView.delegate self];

    NSString *isAuthenticated = [[NSString alloc] init];
    isAuthenticated = [self retrieveUserToken:[[NSUserDefaults standardUserDefaults] valueForKey:@"email"]];
    NSNumber *categorySelected = [[NSNumber alloc] init];
    categorySelected = [[NSUserDefaults standardUserDefaults] valueForKey:@"category_id"];
    if (![isAuthenticated length])
    {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
         [alert show];
         return;
    }else if (categorySelected ==nil) 
    {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"alert" message:@"message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
         [alert show];
         return;
    }

         [self getTableViewData];
    }

 - (void)viewDidUnload
 {
     [self setTableView:nil];
     pull = nil;
     [super viewDidUnload];
     // Release any retained subviews of the main view.
 }

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
     return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }

 - (NSString *)retrieveUserToken:(NSString *)user
 {
     NSError *error = nil;
     NSString *username = user;
     return [SFHFKeychainUtils getPasswordForUsername:username  andServiceName:@"app" error:&error];
 }

 - (void)getTableViewData 
 {
     URLSingleton *urls = [[URLSingleton alloc] init];
     responseData = [NSMutableData data];
     NSNumber *categoryID = [[NSNumber alloc] init];
     categoryID = [[NSUserDefaults standardUserDefaults] valueForKey:@"category_id"];

     NSString *urlComplete = [[NSString alloc] init];
     urlComplete = [urls getEvent:categoryID];
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlComplete]];
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
     [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
     [connection start];
 }

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
 {
     return categories.count;
 }  

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {

     UITableViewCell *cell = [[UITableViewCell alloc]
                         initWithStyle:UITableViewCellStyleDefault
                         reuseIdentifier:@"cell"];

     cell.textLabel.textColor = [UIColor blackColor];
     cell.textLabel.text = [categories objectAtIndex:indexPath.row];
     return cell;
 }

 - (void)viewWillAppear:(BOOL)animated 
 {
     [super viewWillAppear:animated];
     [self.tableView reloadData]; 
 }

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 {
     [responseData setLength:0];
 }

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
     [responseData appendData:data];
 }

 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Message." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
     [pull finishedLoading];
     [alert show];
 }

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
     NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

     NSDictionary *dictionary = [responseString JSONValue];
     NSArray *response = [dictionary valueForKey:@"name"];
     NSArray *responseID = [dictionary valueForKey:@"id"];

     categories = [[NSMutableArray alloc] initWithArray:response];
     eventID = [[NSMutableArray alloc] initWithArray:responseID];
     [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
     [pull finishedLoading];
 } 

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
 {

     UITableViewCell *selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];
     NSString *cellText = selectedCell.textLabel.text;
     int i = 0;
     for(NSString *name in categories)
     {
         if ([name isEqualToString:cellText]) 
         {
             [[NSUserDefaults standardUserDefaults] setValue:[eventID objectAtIndex:i] forKey:@"event_id"];
             [[NSUserDefaults standardUserDefaults] setValue:cellText forKey:@"event_name"];
             [[NSUserDefaults standardUserDefaults] synchronize];
         }
         i++;
     }

     [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

     if(checkedIndexPath) {
         UITableViewCell* uncheckCell = [self.tableView
                                    cellForRowAtIndexPath:checkedIndexPath];
         uncheckCell.accessoryType = UITableViewCellAccessoryNone;
     }
      UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
      cell.accessoryType = UITableViewCellAccessoryCheckmark;
      checkedIndexPath = indexPath;
  }

 -(void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
 {

 }

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
 {

     URLSingleton *urls = [URLSingleton sharedInstance];
     NSNumber *event = [[NSNumber alloc] init];
     if(editingStyle == UITableViewCellEditingStyleDelete)
     {  
         UITableViewCell *selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];
         NSString *cellText = selectedCell.textLabel.text;
         int i = 0;
         for(NSString *name in categories)
         {
             if ([name isEqualToString:cellText]) 
             {
                 event = [eventID objectAtIndex:i];
                 [eventID removeObjectAtIndex:i];
             }
             i++;
         }

         NSString *reqURL = [[NSString alloc] initWithString:[urls deleteEvent:[event stringValue]]];
         NSURLRequest *delReq = [NSURLRequest requestWithURL:[NSURL URLWithString:reqURL]]; 
         NSURLResponse *resp = nil;
         NSError *err = nil; 
         NSData *response = [NSURLConnection sendSynchronousRequest:delReq returningResponse: &resp error: &err];
         NSString *reply = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

         SBJsonParser *parser = [SBJsonParser new];
         id content = [reply JSONValue];
         if(!content){
              NSLog(@"%@", parser.errorTrace);
             [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
             return;
         }
         NSNumber *status = [content valueForKey:@"success"];
         NSNumber *one = [[NSNumber alloc] initWithInt:1];
         if ([status isEqualToNumber:one])
         {
              [categories removeObjectAtIndex:indexPath.row];
              [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
         }else 
         {
             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
             [alert show];
         }

     }
 }

 - (void)pullToRefreshViewShouldRefresh:(PullToRefreshView *)view;
 {
     NSString *isAuthenticated = [[NSString alloc] init];
     isAuthenticated = [self retrieveUserToken:[[NSUserDefaults standardUserDefaults] valueForKey:@"email"]];
     NSNumber *categorySelected = [[NSNumber alloc] init];
     categorySelected = [[NSUserDefaults standardUserDefaults] valueForKey:@"category_id"];
     if (![isAuthenticated length])
     {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
         [alert show];
         return;
     }else if (categorySelected ==nil) 
     {
          UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
         [alert show];
         return;
     }
      [self getTableViewData];
 }

 - (IBAction)createEvent:(id)sender 
 {
     NSString *isAuthenticated = [[NSString alloc] init];
     isAuthenticated = [self retrieveUserToken:[[NSUserDefaults standardUserDefaults] valueForKey:@"email"]];
     NSNumber *categorySelected = [[NSNumber alloc] init];
     categorySelected = [[NSUserDefaults standardUserDefaults] valueForKey:@"category_id"];
     if (![isAuthenticated length])
     {
          UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Message" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
         [alert show];
         return;
     }else if (categorySelected == nil) 
     {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Alert" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
         [alert show];
         return;
     }
     AddEventViewController *aevc = [self.storyboard instantiateViewControllerWithIdentifier:@"AddEventViewController"];
     [self.navigationController popToViewController:aevc animated:YES];
 }
4

1 回答 1

6

我通过添加以下方法修复它

- (void)dealloc
{ 
    [self.tableView removeObserver:pull forKeyPath:@"contentOffset"];
} 
于 2012-06-03T00:00:42.157 回答