2011-01-08 43 views
2

我的代碼的某個地方爆發一路上,和崩潰無法識別的選擇發送到實例」的問題

錯誤消息: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView newMemoViewController:didAddMemo:]: unrecognized selector sent to instance 0x5b55a60'

調試時,程序將運行cancel方法,並在@synthesize處發生異常,但我看不出有什麼問題

症狀是相同的,所以我只包含相關代碼Cancel按鈕:

NewMemoViewController.h

#import <UIKit/UIKit.h> 
@protocol NewMemoDelegate; 


@class AKVoiceMemo; 


@interface NewMemoViewController : UIViewController { 
    @private 
     AKVoiceMemo *voiceMemo; 
     id <NewMemoDelegate> delegate; 
} 

@property (nonatomic, retain) AKVoiceMemo *voiceMemo; 
@property (nonatomic, assign) id <NewMemoDelegate> delegate; 

@end 

@protocol NewMemoDelegate <NSObject> 
- (void)newMemoViewController:(NewMemoViewController *)newMemoViewController didAddMemo:(AKVoiceMemo *)voiceMemo; 


@end 

NewMemoViewController.m

#import "NewMemoViewController.h" 

@synthesize delegate; 


- (void)viewDidLoad { 
    UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)]; 
    self.navigationItem.leftBarButtonItem = cancelButtonItem; 
    [cancelButtonItem release]; 
} 


- (void)cancel { 
    [self.delegate newMemoViewController:self didAddMemo:nil]; 
} 

您的幫助,將不勝感激。

編輯:委託是RootViewController

- (void)newMemoViewController:(NewMemoViewController *)newMemoViewController didAddMemo:(AKVoiceMemo *)voiceMemo { 
    if (voiceMemo){ 
     // Show the note in a new view controller 
     // TODO: Implement this 
    } 

    [self dismissModalViewControllerAnimated:YES]; 
} 

回答

5

你的NewMemoViewController委託可能設置爲UIView對象,而不是一個實現NewMemoDelegate協議的對象。

錯誤消息告訴您newMemoViewController:didAddMemo:消息已發送到UIView對象,並且UIView對象不知道如何處理它。由於cancel方法在委託上調用newMemoViewController:didAddMemo:,因此它是委託人,它是UIView對象,它不識別newMemoViewController:didAddMemo:消息。換句話說,您的代理是UIView,它不實現NewMemoDelegate協議。

如果您正確設置了委託,那麼@jtbandes提出了一個很好的觀點:委託可能會被釋放,並且UIView對象正在接管相同的存儲位置,從而「意外」成爲委託。通過爲您的代理使用assign屬性,您正在做正確的事情;這是相當標準的可可實踐。但是,您確實需要確保代理由另一個對象保留,並且對象需要確保代理只要NewMemoViewController需要它。

+0

嗨,詹姆斯,我也添加了RootViewController的代碼。 忘了從頭部添加一行: @interface RootViewController的:的UITableViewController 讓我知道如果我失去了一些東西 – antalkerekes 2011-01-08 01:09:34

1

我猜你已經過度釋放委託。我注意到你有@property (assign) ... delegate;。這意味着無論何時設置委託,該對象也必須由其他內容保留。

另一種可能性是委託實際上是一個UIView,但我猜這是另一種情況。

相關問題