无法识别的选择发送到实例”的问题
我的代码的某个地方爆发一路上,和崩溃无法识别的选择发送到实例”的问题
错误消息: *** 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
需要它。
我猜你已经过度释放委托。我注意到你有@property (assign) ... delegate;
。这意味着无论何时设置委托,该对象也必须由其他内容保留。
另一种可能性是委托实际上是一个UIView,但我猜这是另一种情况。
嗨,詹姆斯,我也添加了RootViewController的代码。 忘了从头部添加一行: @interface RootViewController的:的UITableViewController 让我知道如果我失去了一些东西 –
antalkerekes
2011-01-08 01:09:34