【问题标题】:Delegate assignment causes EXC_BAD_ACCESS委托分配导致 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

为什么我的程序会崩溃?

【问题讨论】:

    标签: objective-c cocoa memory-management automatic-ref-counting exc-bad-access


    【解决方案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 与文本字段的框架
    猜你喜欢
    • 2011-09-15
    • 2021-10-28
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多