委托分配导致 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];
非常感谢!现在可以了。但是为什么我必须在interface
和ViewController
的implementation
中写一次delegate1
?
我认识到它会将“ABC”打印到控制台中,但不会创建文本字段。为什么委托方法不创建新的文本字段?
因为如果你没有任何指针来处理delegate1
。它将被释放。对于文本字段,检查 IBOutlet window1,以及 window1 与文本字段的框架以上是关于委托分配导致 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章