2010-01-29 25 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

相關問題