我正在尝试使用Interface Builder设置滚动视图的委托。
如果我有这样的代码:
MyScrollViewDelegate * delegate = [[MyScrollViewDelegate alloc] init];
[scrollView setDelegate:delegate];
在viewDidLoad中,一切都很完美。
如果我打开Interface Builder,添加一个NSObject并将该类设置为MyScrollViewDelegate,然后将scrollView的委托链接到我的MyScrollViewDelegate实例并检查viewDidLoad中的[scrollView委托],它看起来像MyScrollViewDelegate的一个实例,我可以进行交互有它,设置proprerties等,看起来不错。
但是,当我在滚动视图中滚动时,我得到一个NSInvalidArgumentException:
*** -[NSCFArray scrollViewDidScroll:]: unrecognized selector sent to instance 0x3d319a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFArray scrollViewDidScroll:]: unrecognized selector sent to instance 0x3d319a0'
所以,问题:
答案 0 :(得分:4)
setDelegate:本身没有区别。
但是,您遇到了内存管理问题。问题是对象不保留其委托(以避免引用循环)。您的委托将被取消分配,并且内存将重新用于阵列。这就是为什么您看到一条消息,旨在让您的委托派遣到一个数组。
由于Interface Builder内存管理的奇怪之处,您看到了不同之处。 “顶级对象”,即在IB文档窗口顶层的文件所有者和主菜单旁边出现的那些对象,它们具有不平衡的保留。这使得你的代表在IB案件中保持活力。
解决方案是为某些东西(可能是您的应用委托)保留滚动视图委托。