【发布时间】: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