委托分配导致 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】委托分配导致 EXC_BAD_ACCESS【英文标题】:Delegate assignment causes EXC_BAD_ACCESS 【发布时间】:2015-11-18 12:06:47 【问题描述】:

我试图在我的视图控制器中为NSTextField 创建一个委托,但程序因EXC_BAD_ACCESS 而崩溃。为什么会这样?我读到我正在调用一个不存在的对象,但我不知道什么不存在。我正在使用 ARC。

这是在我的视图控制器中创建委托对象的方式:

#import <Cocoa/Cocoa.h>
#import "Delegate.h"

@interface ViewController : NSViewController <NSTextFieldDelegate>

@end

--

#import "ViewController.h"
@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    NSTextField* textField1 = [[NSTextField alloc] initWithFrame:NSMakeRect(200, 200, 150, 20)];
    [self.view addSubview:textField1];

    Delegate* delegate1 = [[Delegate alloc]init];
    [textField1 setDelegate:delegate1];


@end

为什么我的程序会崩溃?

【问题讨论】:

【参考方案1】:

我认为delegate1 是发布,在viewDidLoad

Delegate* delegate1 = [[Delegate alloc]init];

您应该在ViewController.h 中创建一个用于处理它的变量。那么

delegate1 = [[Delegate alloc]init];

【讨论】:

我在Viewcontroller.h 中创建了我的委托实例:Delegate* delegate;,并删除了Viewcontroller.m 中的Delegate* delegate1 = [[Delegate alloc]init];。它仍然没有在控制台中打印“ABC”;(。但这一次它没有崩溃;) 不要删除它。请试试我的回答。替换为delegate1 = [[Delegate alloc]init]; 非常感谢!现在可以了。但是为什么我必须在interfaceViewControllerimplementation中写一次delegate1 我认识到它会将“ABC”打印到控制台中,但不会创建文本字段。为什么委托方法不创建新的文本字段? 因为如果你没有任何指针来处理delegate1。它将被释放。对于文本字段,检查 IBOutlet window1,以及 window1 与文本字段的框架

以上是关于委托分配导致 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

无法将委托分配给 UITextField,因为它在 Tableview [重复]

分配给委托的通用方法

委托与事件——C#版本

无法分配 UIPickerView 委托或数据源

初始化后如何为 UITextField 分配委托?

Jmeter(四十三)_合理分配堆内存