我似乎无法弄清楚如何解决我收到的这个错误。我单击一个单元格,它将一个新的 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];
}