2010-01-29 69 views
0

我想使用Interface Builder为滚动视图设置委托。在Interface Builder中使用setDelegate设置委托与区别:?

如果我有这样的代码:

MyScrollViewDelegate * delegate = [[MyScrollViewDelegate alloc] init]; 
[scrollView setDelegate:delegate]; 
在viewDidLoad中

,一切完美的作品。

如果我打开Interface Builder,添加一个NSObject并将类设置为MyScrollViewDelegate,然后将scrollView的委托关联到MyScrollViewDelegate的实例并检查viewDidLoad中的[scrollView委托],它看起来像MyScrollViewDelegate的实例,与它互动,设置适当的东西等,看起来不错。

然而,当我滚动卷轴视图中,我得到一个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委托VS使用setDelegate之间的区别: ?
  2. 为什么在控制台中显示“[NSCFArray scrollViewDidScroll:]”,而不是[MyScrollViewDelegate scrollViewDidScroll:]?
  3. 我可能做错了什么?

回答

4

有一个在setDelegate没有区别:本身。

但是,您有内存管理问题。问题是对象不保留其代表(以避免引用周期)。您的委托正在取消分配,并且内存被重新用于数组。这就是为什么你看到一个消息打算将你的委托调度到一个数组。

由于Interface Builder内存管理的怪异性,你会看到不同之处。 “顶级对象”,即在IB文档窗口顶层的文件所有者和主菜单旁边出现的那些对象,其保留不平衡。这是让你的委托活着在国际局的情况。

解决方案是为了保留滚动视图委托,可能是您的应用程序委托。

请参阅Memory Management of Nib Objects

+0

干杯,我为代表添加了一个IBOutlet。 – Douglas 2010-01-30 00:06:25

相关问题