0

我有一个带有图像初始化的表格视图的视图控制器。我正在使用 AFNetworking 加载图像,有时(主要是当我的互联网连接速度较慢时)当我单击视图控制器中的后退按钮项并进入 rootviewcontroller 应用程序崩溃时,我收到以下消息:

-[__NSCFDictionary numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x1f567e30

为什么?我正在使用 ARC。这是我加载图像的代码

if(item.thumb)
    {
        [cell.listItemImage setImage: item.thumb];

    }
    else
    {

        UIActivityIndicatorView *loadingSymbol = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray];
        loadingSymbol.frame = CGRectMake(0, 0, cell.listItemImage.frame.size.width, cell.listItemImage.frame.size.height);
        [cell.listItemImage addSubview: loadingSymbol];
        [loadingSymbol startAnimating];


        [cell.listItemImage setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: item.thumbUrl]]
                                  placeholderImage:[UIImage imageNamed:@"transparent.png"]
                                           success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image )
        {

                item.thumb = image;
            [cell setNeedsLayout];
                [loadingSymbol removeFromSuperview];
               [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

        }
        failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
        {
             NSLog(@"something went wrong wiv the images");
            NSLog(@"%@", error);
             //[loadingSymbol removeFromSuperview];

        }
         ];
    }
}

如果有人可以在这里帮助我,我会很高兴!

编辑:

解决了我的第一个问题。但是现在,当我在表格视图中滚动时,应用程序崩溃了。我认为这与以下行有关:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

任何想法为什么?

4

2 回答 2

0

Problem: The network I/O finishes some time after your view controller has deallocated. As a result of the network I/O you reload some cells. Reloading the cells call the view controller (deallocated) for dataSource information and crashes.

Solution: You must nil out the table view delegate and dataSource in dealloc.

- (void)dealloc {
    // Cleanup table view 
    self.tableView.delegate = nil;
    self.tableView.dataSource = nil;

    // Stop network operations since their are not needed anymore.
    for (UITableViewCell *cell in [self.tableView visibleCells]) {
        [cell. listItemImage cancelImageRequestOperation];
    }
 }

In your cellForRowAtIndexPath cancel image download before reuse:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCellId";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // Cancel network request
    [cell. listItemImage cancelImageRequestOperation];
    ...
}
于 2013-06-02T19:07:48.003 回答
0

dealloc在视图控制器的方法中添加以下行。这在一个项目中对我有用。

[[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];  

你的 dealloc 看起来像这样

-(void)dealloc
{
  [[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];  

  //your other clean ups

  [super dealloc];
}

编辑

在 ViewController 的头文件中,为 UITableView 添加一个 IBOutlet

IBOutlet UITableView *myTableView;

从 Interface Builder将您连接UITableView到该插座 ( )。myTableView

在你的 dealloc 中将 IBOutlet 设置为 nil

-(void)dealloc
{
   myTableView = nil;
   //your other clean ups
   [super dealloc];
}

您的成功块应如下所示

success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image )
        {
           if(myTableView)
           {
              item.thumb = image;
              [cell setNeedsLayout];
              [loadingSymbol removeFromSuperview];
             [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
           }

        }

编辑 2(滚动)

在您的成功块中,而不是:

[tableView reloadRowsAtIndexPaths:[NSArray arayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

利用:

[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
于 2013-06-02T17:55:51.870 回答