Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS SDK中的UIScrollView EXC_坏访问崩溃_Iphone_Uiscrollview_Exc Bad Access - Fatal编程技术网

Iphone iOS SDK中的UIScrollView EXC_坏访问崩溃

Iphone iOS SDK中的UIScrollView EXC_坏访问崩溃,iphone,uiscrollview,exc-bad-access,Iphone,Uiscrollview,Exc Bad Access,我有一个iphonesdk应用程序,它有几个视图,在用户创建内容时出现和消失。在设备上使用应用程序一段时间后,我遇到以下崩溃: Program received signal: “EXC_BAD_ACCESS”. (gdb) backtrace #0 0x33369ebc in objc_msgSend () #1 0x320e5248 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] () #2 0x3

我有一个iphonesdk应用程序,它有几个视图,在用户创建内容时出现和消失。在设备上使用应用程序一段时间后,我遇到以下崩溃:

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) backtrace
#0  0x33369ebc in objc_msgSend ()
#1  0x320e5248 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] ()
#2  0x338b4a14 in -[NSObject performSelector:withObject:] ()
#3  0x320e5098 in -[UIAnimator stopAnimation:] ()
#4  0x320e4b7c in -[UIAnimator(Static) _advance:] ()
#5  0x320e4a34 in LCDHeartbeatCallback ()
#6  0x34350e60 in HeartbeatVBLCallback ()
#7  0x332e91c0 in IOMobileFramebufferNotifyFunc ()
#8  0x316532f8 in ?? ()
#9  0x33866b50 in __CFMachPortPerform ()
#10 0x338ae52a in CFRunLoopRunSpecific ()
#11 0x338adc1e in CFRunLoopRunInMode ()
#12 0x3434e1c8 in GSEventRunModal ()
#13 0x32002c30 in -[UIApplication _run] ()
#14 0x32001230 in UIApplicationMain ()
#15 0x00002ff8 in main (argc=1, argv=0x2ffff550) at /Developer/svn/MyCompany/iPhone/MyApplication/Other Sources/main.m:14
正如您可以从跟踪中看到的那样,这里只提到我的代码是对main的调用

我已经从Xcode运行了Build和Analyze,还将其设置为从终端在我的项目上运行clang analyzer,这两个工具在代码中都找不到任何问题。我使用的是iOS SDK的最新版本(我还没有下载4.1,但我使用的是4.1之前的版本)

此外,我已经在带有模拟器的仪器中运行了该应用程序,并且该应用程序没有内存泄漏

我将尝试使用
NSZombieEnabled
变量,看看是否找到了什么,但问题是我需要在应用程序崩溃之前使用30到40分钟左右,我怀疑
NSZombieEnabled
甚至可能无法帮我找到问题

我看到的崩溃似乎是当模式视图调用父视图控制器中的委托时发生的。然后,父视图控制器在解除模态视图控制器之前执行一些处理。在崩溃中有一些关于动画和滚动视图的引用,但我不确定我可以做些什么来引起这些问题。有人对要找的东西有什么建议吗

编辑:我已将
NSZombieEnabled
标志放入应用程序,在设备上,它会在控制台中显示以下消息:

2010-09-11 17:10:33.970 MyApplication[9321:207] *** 
-[MyViewController respondsToSelector:]: message 
sent to deallocated instance 0x7489480
据我所知,在我所有类的dealloc中,我正在将应用程序中使用的委托设置为nil,因此我被困在下一步要看的地方

我尝试在这上面使用
malloc_history
pid address命令,但它说找不到进程,我尝试了9321、9321:207和207。另外,如果我尝试使用
MallocStackLogging
变量,程序将不会在设备上运行,我会得到一堆
malloc:
无法在控制台中创建堆栈日志目录消息,并且程序崩溃


哦,顺便说一句,我不能使用zombies签入工具,因为它似乎与设备不兼容,而且我也不能在模拟器中发生同样的崩溃。

我猜scrollview的委托被设置为已解除分配的对象。尝试在dealloc方法中将子对象的所有代理设置为零。

堆栈帧上的
UIScrollView
#1可能希望通知其代理动画结束,但此时代理已消失。设置
NSZombieEnabled
可能会确认这一点


代理未保留,因此这是Cocoa和Cocoa Touch中的常见错误。在代码中的
UIScrollView
UITableView
上查找学员,并尝试找出哪一个学员可能会在发布之前发布。

我自己刚刚解决了这个问题

我有一个问题:

  • scrollview委托已连接到UIViewController
  • 滚动视图开始制作动画
  • 代表走了,叫了Dealoc
问题是scrollview委托消息在一个新的解除分配对象上触发,崩溃日志有点混乱,因为它们指向的是无意义的对象引用

修复方法是将scrollview委托设置为nil,作为我的视图控制器dealloc方法的第一行


希望这对其他人有帮助

为了完整起见,我添加了这个堆栈跟踪(iOS 6),用于那些可能会遇到相同问题但实现和重现问题的确切步骤略有不同的人

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x71f05631
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x3919b5d0 objc_msgSend + 1
1   UIKit                           0x33421830 -[UIScrollView(UIScrollViewInternal) _delegateScrollViewAnimationEnded] + 48
2   UIKit                           0x334217ba -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded:finished:] + 130
3   UIKit                           0x334216a4 -[UIAnimator stopAnimation:] + 460
这发生在iOS 6上,在我实现 UIScrollViewDelegate方法:

" -(void)scrollViewDidEndDecelerating:(UITableView *)tableView" 
and made a call to:
"[tableView scrollToRowAtIndexPath: indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];".  
问题发生在动画开始时,我按下“后退”按钮,在动画完成之前,我的视图控制器弹出

复制时,必须确保在动画开始后但在动画完成之前按下“后退”按钮。我试了几次。我试图通过编程方式关闭视图控制器来重新创建问题,但无法重现。我不得不用“后退”按钮。我只是在Dealoc中调用了[myTableView release]。解决方案如下所述,将这两个属性设置为零:

self.myTableView.delegate = nil;
self.myTableView = nil;

如果将刷新控制器作为子视图插入到表视图中,可能会发生这种情况(我的提示是,千万不要这样做)

首先,代理应为弱/分配类型。但在这种情况下,有一个非常常见的事件 由滚动动画驱动的微妙障碍。如果使用动画内容偏移更改 您的ScrollView强烈需要在dealloc方法中将其委托设置为nil

否则您将得到以下结果

[YourViewController respondsToSelector:]: message sent to deallocated instance
最常见的例子是:

1. _tableView is ivar of YourViewController
2. _tableView.delegate = self;
3. - (void)scrollViewDidScroll:(UIScrollView *)scrollView is implemented at YourViewController
4. at some point you call [_tableView scrollToRowAtIndexPath:indexPath 
   atScrollPosition:UITableViewScrollPositionBottom animated:YES];
   or [_tableView setContentOffset:CGPoint animated:YES]
   and try to close YourViewController

CoreAnimation保留了_tableView,但解除了ViewController的分配

所有这些都没有解决我的问题,所以我再次深入挖掘代码。 当我执行键盘和UICollectionView动画(是的,这是聊天)并关闭当前控制器时,我发现崩溃出现了

应用程序崩溃,因为我尝试在动画完成块中进行滚动:)

只要剪掉它,现在一切都好了


愉快的编码和调试:)

在遇到我设置的相同问题后:

self.collectionView.delegate = nil;
-(void)viewDidLoad
中(实际将ViewController设置为collectionView委托之前) 和
-(void)视图将消失:(BOOL)动画

现在一切都好了


谢谢您的帮助。

当使用不存在的indexPath调用ScrollToRowatineXpath时,我看到了这种行为。为了明确起见,代理属性应始终设置为
assign
,而不是
retain
始终存在异常