UIScrollView 之 EXC_BAD_ACCESS

本文探讨了在Objective-C与Swift混合项目中遇到的内存管理挑战,特别是当Objective-C类作为Swift框架的一部分时,如何避免野指针错误。通过实例演示了在Swift中使用Objective-C类时的正确实践,包括使用代理模式和确保资源在适当时候被释放,以提高应用的稳定性和性能。

废话只说一句,直接进主题:额。。。


@interface HYTOrderCommentViewController ()<UIScrollViewDelegate>

@property (nonatomic,weak)UIScrollView *scrollView;

@end


@implementation HYTOrderCommentViewController


// lazer

-(UIScrollView *)scrollView {

    if (_scrollView == nil) {

        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];

        scrollView.delegate = self;

        [self.view addSubview:scrollView];

        _scrollView = scrollView;

    }

    return _scrollView;

}


#pragma mark -scrollViewDelegate 代理

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    [self.view endEditing:YES];

}


由于项目需要,在项目中使用了scrollview,并把delegate 设置为self;

随后 navigationcontroller pop时 HYTOrderCommentViewController销毁,在HYTOrderCommentViewController界面还未从屏幕(系统默认是左向右滑出屏幕)滑出时快速的上下拉动屏幕(根控制器是tableViewController,可以拉动),程序crash。


报错 EXC_BAD_ACCESS,野指针错误。

添加NSZombieEnabled 和 MallocStackLogging (用完记得删除)



重复运行程序,crash后会报错

*** -[HYTOrderCommentViewController scrollViewDidScroll:]: message sent to deallocated instance 0x7fe256cb0200


大概意思是调用了已经释放的HYTOrderCommentViewController对象的scrollViewDidScroll方法;


可见,使用scrollview的代理并不是很安全,需要在使用后 dealloc 方法里置空 (nil);


- (void)dealloc {

    self.scrollView.delegate = nil;

    NSLog(@"dealloc------死了好多次啦");

}



- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ [self at_searchViewShow:YES]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ if(decelerate && self.selIndex < self.dataArray.count){ if(self.dataCount != self.dataArray.count){ self.dataCount = self.dataArray.count; [self.collectionView reloadData]; }else{ [UIView performWithoutAnimation:^{ [self.collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:self.selIndex inSection:0]]];//初始化 }]; } } } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSInteger page = ceil(scrollView.contentOffset.y /(self.collectionView.height>0?self.collectionView.height:kSCREEN_HEIGHT)); if(page < self.dataArray.count){ self.selIndex = page; if(self.selectListIndex){ self.selectListIndex(page); } ATGroupModel *model = self.dataArray[page]; if (!NSStringIsNullOrEmpty(self.at_searchKey)) { model.searchKeyWord = self.at_searchKey; } [[FNAppReviewConfig shareManager] addBrowseRecord:model.theID click_uuid:model.click_uuid];//浏览记录 } [self at_searchViewShow:NO]; ATLog(@"打印index页码%li",page); } -(void)at_searchViewShow:(BOOL)isStatue{ if(isStatue){ [[self class] cancelPreviousPerformRequestsWithTarget:self];//清除上一个 [self.searchView setHidden:YES]; [self.backBtn setHidden:YES]; [self.searchView setAlpha:0]; [self.backBtn setAlpha:0]; }else{ [self performSelector:@selector(dismissalert:) withObject:@"firstParameter" afterDelay:1.0]; } } - (void)dismissalert:(NSString*)alert { [self.searchView setHidden:NO]; [self.backBtn setHidden:NO]; [self.searchView setAlpha:0.3]; [self.backBtn setAlpha:0.3]; [UIView transitionWithView:self.searchView duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ } completion:^(BOOL finished) { [self.searchView setAlpha:1.0]; [self.backBtn setAlpha:1.0]; }]; }此代码,滑动时隐藏搜索框,停止滚动时显示搜索框,代码中,当前控制器销毁后是否会出现异常
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值