在Interface Builder中设置委托与使用setDelegate之间的区别是什么?

时间:2010-01-29 23:12:47

标签: iphone interface-builder delegates

我正在尝试使用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'

所以,问题:

  1. 在Interface Builder中设置委托与使用setDelegate之间有什么区别:?
  2. 为什么“[NSCFArray scrollViewDidScroll:]”在控制台中,而不是[MyScrollViewDelegate scrollViewDidScroll:]?
  3. 我能做错什么?

1 个答案:

答案 0 :(得分:4)

setDelegate:本身没有区别。

但是,您遇到了内存管理问题。问题是对象不保留其委托(以避免引用循环)。您的委托将被取消分配,并且内存将重新用于阵列。这就是为什么您看到一条消息,旨在让您的委托派遣到一个数组。

由于Interface Builder内存管理的奇怪之处,您看到了不同之处。 “顶级对象”,即在IB文档窗口顶层的文件所有者和主菜单旁边出现的那些对象,它们具有不平衡的保留。这使得你的代表在IB案件中保持活力。

解决方案是为某些东西(可能是您的应用委托)保留滚动视图委托。

请参阅Memory Management of Nib Objects