1

我花了很多时间寻找这个答案,但我估计是我的新手身份阻止了我看到光明。

我正在子类化UIScrollView以使其成为无限寻呼机。作为其中的一部分,我需要查看何时出现新页面,因为我打算一次只使用三个“页面”以节省内存。这意味着我需要让我的子类也充当代表。

我遵循了以下说明:https ://stackoverflow.com/a/9986842/773329 。但我遇到了一些奇怪的(对我来说)问题。

这里的主要问题是,当我覆盖时setDelegate:(id<UIScrollViewDelegate>),插入用户的委托,我在程序集中得到一个不退出的循环:

-(void)setDelegate:(id<UIScrollViewDelegate>)delegate {
    _selfDelegate->_userDelegate = delegate;
    super.delegate = nil;
    super.delegate = (id)_selfDelegate;
}

大会:

libobjc.A.dylib`objc_release:
0x12be090:  pushl  %ebp
0x12be091:  movl   %esp, %ebp
0x12be093:  subl   $8, %esp
0x12be096:  calll  0x12be09b                 ; objc_release + 11
0x12be09b:  popl   %ecx
0x12be09c:  movl   8(%ebp), %eax
0x12be09f:  testl  %eax, %eax
0x12be0a1:  je     0x12be0d5                 ; objc_release + 69
0x12be0a3:  movl   (%eax), %edx              ; <<< This is where the loop is
0x12be0a5:  movl   16(%edx), %edx
0x12be0a8:  andl   $-4, %edx
0x12be0ab:  testb  $2, 2(%edx)
0x12be0af:  je     0x12be0c5                 ; objc_release + 53
0x12be0b1:  movl   1002149(%ecx), %ecx
0x12be0b7:  movl   %ecx, 4(%esp)
0x12be0bb:  movl   %eax, (%esp)
0x12be0be:  calll  0x12bd08c                 ; objc_msgSend
0x12be0c3:  jmp    0x12be0d5                 ; objc_release + 69
0x12be0c5:  movl   %eax, (%esp)
0x12be0c8:  movl   $0, 4(%esp)
0x12be0d0:  calll  0x12bf9d0                 ; -[NSObject release]
0x12be0d5:  addl   $8, %esp
0x12be0d8:  popl   %ebp
0x12be0d9:  ret    

有什么可能导致问题吗?

4

2 回答 2

2

根据您正在做的事情,我认为 aUICollectionView非常适合您想要完成的事情。这使您不必编写自己的代码来重用视图以及为了获得高性能代码而必须做的其他事情。

UICollectionView 参考

于 2013-05-04T16:08:30.037 回答
1

您绝对可以并且应该通过使用常规委托来实现无限滚动。您希望在子类中覆盖哪些特定功能?

于 2013-05-03T15:28:51.240 回答