拖动 UIScrollView 时的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】拖动 UIScrollView 时的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS when dragging UIScrollView 【发布时间】:2012-11-27 20:23:22 【问题描述】:

在控制器中,我正在创建 UIScrollView。我正在尝试将此视图控制器设置为 UISCrollview 委托并实现委托的方法以便添加(稍后)一个 UIPageControl。

我读了一点,在 SO 上找到了this link、this other link 和其他,以及一些有用的教程,但我不明白我做错了什么。每次滚动 UIScrollView 时,应用程序都会因 EXC_BAD_ACCESS 错误而崩溃。

这是我的 .h 文件

#import <UIKit/UIKit.h>

@interface StatsViewController : UIViewController <UIScrollViewDelegate> 
     UIScrollView *scrollView;
     UIPageControl *pageControl;


@end

然后在我的 .m 文件中,我正在创建滚动视图并尝试像这样定义委托方法:

- (void)viewDidLoad 
     [super viewDidLoad];
     NSInteger boxWidth = self.view.frame.size.width;
     NSInteger boxHeight = 412;
    scrollView = [ [UIScrollView alloc] initWithFrame:CGRectMake(0, 0,      self.view.frame.size.width, boxHeight)];
    scrollView.pagingEnabled = TRUE;
    scrollView.delegate = self;

     NSInteger numberOfViews = 2;

    StatBreatheCounter *breatheCounter = [ [StatBreatheCounter alloc] init];
    breatheCounter.view.frame = CGRectMake(0, 0, boxWidth, boxHeight);
    [scrollView addSubview:breatheCounter.view];

    BreatheLocationViewController *breatheLocation = [ [BreatheLocationViewController alloc] init];
    breatheLocation.view.frame = CGRectMake(320, 0, boxWidth, boxHeight);
    [scrollView addSubview:breatheLocation.view];

     scrollView.contentSize = CGSizeMake(self.view.frame.size.width * numberOfViews, boxHeight);
     [self.view addSubview:scrollView];

 - (void)scrollViewDidScroll:(UIScrollView *)sender 
     NSLog(@"RUNNING");
 

...但是每次我在滚动视图上滑动时,应用程序都会崩溃。 现在,我在 Ojective-C 上相当出色,但我觉得我错过了一些东西。浏览所有内容都表明委托可以提前释放,并且当用户触发操作时,没有人在处理该方法(抱歉解释:))。 ...但如果委托是视图控制器本身,它怎么能被释放呢?

如你所见,我很困惑:( 任何帮助将不胜感激

-- 编辑: 我将在这里包括通过您的 cmets 和回答建立的解决方案。 当我发布我的问题时,我非常确信错误来自我创建 UIScrollView 并设置其委托的方式,以至于我没有意识到问题是(正如一切所暗示的那样,顺便说一句:))我正在分配StateViewController 在其父级中没有声明对它的任何“强”引用(再次,抱歉解释,我真的是一个 n00b)。 非常感谢您帮助我指出正确的方向

【问题讨论】:

崩溃可能发生在viewDidLoadBreatheLocationViewController。只有堆栈跟踪可以验证这一点。能否请您将崩溃消息复制到控制台并粘贴到此处。 @ACB 感谢您的帮助....但是如果评论我设置“scrollView.delegate = self”的行,一切正常,所以我不认为问题出在其他视图控制器。对不起我的无知,但我在哪里可以找到你建议我复制的信息?在调试导航器中,我有很多信息,与线程 1、0 objs_msgSend 相关的部分是否足够? 它应该在您的控制台中。只需复制它说崩溃的地方并将其粘贴到您的问题中。检查这个。 ***.com/questions/6462214/… 和 ***.com/questions/3651204/… 你还在你的 scrollView 委托方法中做其他事情吗?如果您只是将其注释掉会发生什么? 【参考方案1】:

看起来您在滚动期间失去了对委托的引用。我会调查 StatsViewController 周围的任何其他发布事件或其他可能导致它被取消引用的事件。

【讨论】:

@SrRichie 你如何“保留”/“存储”/分配 StatsViewController?

以上是关于拖动 UIScrollView 时的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

拖动包含 UIScrollView 的 UIView

拖动时如何让 UIScrollView 离开屏幕

UIScrollView 在拖动和点击之间做出决定

拖动后取消 UIScrollView 弹跳

在 UIScrollView 中拖动一个 UIView

在 UIScrollView 中拖动 UIButtons?