【问题标题】:Subclass as Delegate作为代表的子类
【发布时间】:2013-05-03 14:45:57
【问题描述】:

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

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

有什么可能导致问题的原因吗?

【问题讨论】:

  • 您需要两个代表的任何特殊原因?为什么不在普通委托中实现分页,它应该是您拥有的对象。
  • 我什至会考虑不使用你自己的 UIScrollView 子类;为什么不使用 UICollectionView?
  • 委托只是一个实现特定接口的类。它通常应该作为对相关数据具有最佳访问权限的类的一部分来实现,但如果这似乎有意义,您可以将其设为一个单独的类,该类必须去其他地方查找数据。 代表绝对没有什么“特别”的地方。
  • 不会“super.delegate = bla;”最终递归调用这个设置器?
  • 不要子类化 UIScrollView,苹果类在某些情况下实际上有多个委托。

标签: objective-c


【解决方案1】:

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

UICollectionView Reference

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多