无法识别的选择发送到实例”的问题

问题描述:

我的代码的某个地方爆发一路上,和崩溃无法识别的选择发送到实例”的问题

错误消息: *** 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]; 
} 

你的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

我猜你已经过度释放委托。我注意到你有@property (assign) ... delegate;。这意味着无论何时设置委托,该对象也必须由其他内容保留。

另一种可能性是委托实际上是一个UIView,但我猜这是另一种情况。