gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:29:00 26 4
gpt4 key购买 nike

我的代码在某个地方出现了问题,并且在使用导航栏按钮时崩溃了。

错误信息:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIView newMemoViewController:didAddMemo:]:无法识别的选择器发送到实例 0x5b55a60”

调试时,程序确实运行了cancel方法,并在@synthesize行抛出异常。不过,我看不出有什么问题。

症状是相同的,因此我仅包含取消按钮的相关代码:

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];
}

我们将不胜感激您的帮助。

编辑:委托(delegate)是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 的委托(delegate)设置为 UIView 对象,而不是实现 NewMemoDelegate 协议(protocol)的对象。

错误消息告诉您 newMemoViewController:didAddMemo: 消息已发送到 UIView 对象,而 UIView 对象没有发送知道如何处理它。由于您的 cancel 方法在委托(delegate)上调用 newMemoViewController:didAddMemo:,因此 delegate 就是 UIView 对象无法识别 newMemoViewController:didAddMemo: 消息。换句话说,您的委托(delegate)是一个 UIView 并且它没有实现 NewMemoDelegate 协议(protocol)。

如果您正确设置委托(delegate),那么 @jtbandes 提出了一个很好的观点:委托(delegate)可能正在被释放,并且 UIView 对象正在接管相同的内存位置,从而“成为”委托(delegate)意外地。通过为委托(delegate)使用 assign 属性,您正在做正确的事情;这是相当标准的 cocoa 实践。但是,您确实需要确保委托(delegate)由另一个对象保留,并且该对象需要确保只要 NewMemoViewController 需要它,委托(delegate)就会一直存在.

关于iphone - 无法识别的选择器发送到实例”问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com