Ios 使用tableview从视图控制器返回时应用程序崩溃
我有一个视图控制器,带有带有images init的表视图。 我正在使用AFNetworking加载图像,有时(主要是当我的internet连接很慢时),当我单击view controller中的Backbuttonie并进入rootviewcontroller时,应用程序崩溃,我收到以下消息:Ios 使用tableview从视图控制器返回时应用程序崩溃,ios,objective-c,tableview,afnetworking,Ios,Objective C,Tableview,Afnetworking,我有一个视图控制器,带有带有images init的表视图。 我正在使用AFNetworking加载图像,有时(主要是当我的internet连接很慢时),当我单击view controller中的Backbuttonie并进入rootviewcontroller时,应用程序崩溃,我收到以下消息: -[__NSCFDictionary numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x1f567e30
-[__NSCFDictionary numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x1f567e30
为什么??
我在用弧。
这是我加载图像的代码
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];
你知道为什么吗 在视图控制器的
dealloc
方法中添加以下行。这在一个项目中对我起了作用
[[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];
您的dealloc将看起来像这样
-(void)dealloc
{
[[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];
//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];
}
}
编辑
在ViewController的头文件中,为UITableView添加IBOutlet
ibuitableview*myTableView代码>
从Interface Builder将您的UITableView
连接到该插座(myTableView
)
在dealloc中将IBOutlet设置为零
-(void)dealloc
{
myTableView = nil;
//your other clean ups
[super dealloc];
}
您的成功块应该如下所示
-(void)dealloc
{
[[UIImageView af_sharedImageRequestOperationQueue] cancelAllOperations];
//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];
使用:
问题:视图控制器解除分配后,网络I/O将在一段时间内完成。网络I/O的结果是重新加载一些单元格。重新加载单元格会调用视图控制器(解除分配)以获取数据源信息和崩溃
解决方案:必须在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];
}
}
在cellForRowAtIndexPath中,在重新使用之前取消图像下载:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Cancel network request
[cell. listItemImage cancelImageRequestOperation];
...
}
根据错误消息,您设法将NSDictionaryObject分配给框架需要表委托的某个属性。因此,当表视图控制器已释放但后台仍加载数据时,会发生这种情况。很显然,您保留了对不应再存在的单元格对象的引用。单元格本身可能仍然存在,因为这取决于它是强引用还是弱引用。我不确定。“[cell setNeedsLayout]”是否会导致单元格和表被重新绘制,而表或其控制器不再存在?但是,您应该找到一些更聪明的解决方案。返回时取消所有打开的请求,或者在相关视图不可见/不存在时不再处理数据。嗯,我返回时如何取消打开的请求?您是否使用UIImageView+AFNetworking
?谢谢,但是当我按照您所说的做时,我得到了以下错误:选择器af_sharedImageRequestOperationQueue没有已知的类方法?您是否在视图控制器文件中放入了#import“UIImageView+AFNetworking.h”
?(包括.h文件)这很奇怪,因为最新版本的库中有这种方法。(参考源代码…)我将编辑答案并添加另一个解决方法(不要将列表格式与源格式混合。因此会把它搞砸。)嗯,等等,现在滚动tableview时它会崩溃??我也这么做了,但现在上下滚动时我的应用程序会崩溃。当internet连接缓慢时发生。知道为什么吗?我正在使用UIImageView+AFNetworking,我认为我使用它的方式是正确的。。我也收到了这条消息,不知道它是什么意思:purgeIdleCellConnections:find one to purge conn=0x1D5BB9A0您可以发布您的滚动崩溃吗?你在帖子中提到的崩溃与dealloc未滚动有关。编辑了我的问题,我不知道你想让我发布哪段代码?当我滚动“是”时,应用程序崩溃了,但我认为这与AFNetworking有关,因为我有一个没有图像的tableview,工作正常。