2011-07-14 42 views
3

委託崩潰我代表與EXC_BAD_ACCESS

@property (nonatomic, assign) id <DelegateProtocol> delegate; 

,但它會崩潰performSelector

if (_delegate != nil && [_delegate conformsToProtocol:@protocol(DelegateProtocol)]) 
{ 
    NSObject *obj = _delegate; 
//HERE IS EXC_BAD_ACCESS 
    [obj performSelectorOnMainThread:@selector(didTouchImageView:) withObject:self waitUntilDone:NO]; 
} 

我設置委託在這裏:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [invoiceTabImage setDelegate:self]; 
} 

,問題是爲什麼它可能是。

回答

5

EXC_BAD_ACCESS意味着你的代理已經在你發送消息didTouchImageView時被釋放(當你發送消息performSelector時,我認爲一切正常),這太容易了。

首先,檢查您的委託的保留/發佈管理,看看是否有任何不正確。

如果一切正常,調試的一種可能性是啓用殭屍(您可以通過儀器/運行性能工具或調試時設置環境變量來實現)。

這可以幫助您檢測問題的原因。

如果您需要更多幫助,請發佈關於如何創建/保留/釋放委託對象的代碼,並粘貼崩潰的堆棧跟蹤。

編輯:

兩個提示:

  1. 的關鍵,與代表工作(不保留它們)是確保視圖控制器(你的情況也委託)生活長於invoiceTabImage;然後您可以查看invoiceTabImage的生命週期(創建/發佈時)並將其與代表進行比較;

  2. 控制器的dealloc,加入這一行:

    invoiceTabImage = nil;

    這樣,您可以確保在控制器/委託被移除時,委派對象知道委託不在那裏;該程序將無法工作,但可能不會崩潰。

+0

+1 99%,這是訪問一個釋放的對象,查找'NSZombie'與這些幫助,但如果你知道它代表訪問期間的,那麼這就是你的問題。 – bshirley

+0

是的,但如何存檔它沒有(保留)委託?如何做到「正確」? – Marcin

+0

請參閱我的編輯... – sergio

1

只是檢查它是否被設置爲零(這是dealloc會做什麼)。

這解決了我的問題:時間

- (void)setDelegate:(id<UITableViewDelegate>)newDelegate 
    { 
     if (newDelegate!=nil) { 
      if (newDelegate != self.collapseDelegate) 
      { 
       self.collapseDelegate = newDelegate; 
       [super setDelegate:self.collapseDelegate?self:nil]; 
      } 
     } 
    } 
+0

謝謝,其工作 –

+0

我們不應該推動此修復?我仍然看到它存在和這種情況: if(newDelegate!=零){ 未出現在源中。 – RomanN