子类为委托

时间:2013-05-03 14:45:57

标签: objective-c

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

我将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    

是否有可能导致问题的原因?

2 个答案:

答案 0 :(得分:2)

根据您的工作,我认为UICollectionView完全符合您想要完成的任务。这使您无需编写自己的代码来重用视图以及为了获得高性能代码而必须执行的其他操作。

UICollectionView Reference

答案 1 :(得分:1)

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