Objective-C & EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】Objective-C & EXC_BAD_ACCESS【英文标题】: 【发布时间】:2011-04-21 16:56:50 【问题描述】:

我对 Objective-C 和 Cocoa 还是很陌生,但我正在努力学习。我正在创建一个简单的 ToDo 管理器,但我不断收到 EXC_BAD_ACCESS 崩溃,我不知道为什么。崩溃发生在我的 main.m 文件中“return NSApplicationMain(argc, (const char **)argv);”所以真的很难调试。

这是我的应用委托的实际实现文件。

#import "ToDoAppDelegate.h"
#import "Task.h"

@implementation ToDoAppDelegate

@synthesize textTaskName;
@synthesize taskDate;
@synthesize window;
@synthesize newTaskWindow;
@synthesize tableView;
@synthesize arrayController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    taskArray = [[NSMutableArray alloc] init];

    [taskArray retain];


- (IBAction)addTaskClick:(id)sender 

    [NSApp beginSheet:newTaskWindow modalForWindow:window modalDelegate:self didEndSelector:NULL contextInfo:NULL];

    [taskDate setDateValue:[NSDate date]];


- (IBAction)btnSaveClick:(id)sender 

    Task *newTask = [[Task alloc] init];

    [newTask setTaskName:[textTaskName stringValue]];
    [newTask setTaskDueDate:[taskDate dateValue]];

    [arrayController addObject:newTask];
    [newTask release];

    [textTaskName setStringValue:@""];

    [NSApp endSheet:newTaskWindow];
    [newTaskWindow orderOut:self];


- (IBAction)btnCancelClick:(id)sender 

    [NSApp endSheet:newTaskWindow];
    [newTaskWindow orderOut:self];


@end

当调用 btnSaveClick 方法时会发生什么,我在方法执行完成后立即出现 EXC_BAD_ACCESS 崩溃。

这是崩溃的回溯:

(gdb) bt
#0  0x00007fff851d212d in objc_msgSend ()
#1  0x00007fff80f9d1e6 in _CFAutoreleasePoolPop ()
#2  0x00007fff809a0fe0 in -[NSAutoreleasePool drain] ()
#3  0x00007fff8780451f in -[NSApplication run] ()
#4  0x00007fff877fd1a8 in NSApplicationMain ()
#5  0x0000000100001a82 in main (argc=1, argv=0x7fff5fbff638) at /Users/mattwise1985/Documents/Development/xCode Projects/ToDo/ToDo/main.m:13

由于这只是一个测试项目,我不介意是否有人想下载它来检查我有什么问题。可以从这里下载:http://www.narfsoft.com/downloads/ToDo.zip

【问题讨论】:

在崩溃时向我们展示 GDB 的回溯。 将回溯添加到主帖。 【参考方案1】:

尝试启用 NSZombie。您很可能是在对象被释放后向它发送消息。

http://www.cocoadev.com/index.pl?NSZombieEnabled

【讨论】:

【参考方案2】:

您确定为arrayController 设置了出口,而不是nil

顺便说一句:

taskArray = [[NSMutableArray alloc] init];

[taskArray retain];

你需要释放两次你的数组,因为你在明确分配它之后保留它......

正如乔纳森所说,来自 GDB 的回溯将不胜感激......

【讨论】:

我有outlet设置,在接口文件中设置:@property (assign) IBOutlet NSArrayController *arrayController;【参考方案3】:

出现此问题是因为您已为表格视图列设置绑定,但尚未为表格视图本身设置绑定。

在 MainMenu.xib 中,选择表格视图并将其内容(表格内容 > 内容)绑定到数组控制器,键 arrangedObjects。当您使用它时,将其选择索引(表格内容 > 选择索引)绑定到数组控制器,键 selectionIndexes

【讨论】:

好吧,我以为做到了。经过更多测试,它适用于我添加第一项。当我尝试添加另一个项目时,它再次崩溃并出现 EXC_BAD_ACCESS

以上是关于Objective-C & EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

& (&) 和 && or | 之间的区别(管道)和||在Objective-C中?

Objective-C & Swift 2.0 和“偏执”类

在 Objective-C 中使用三元运算符 + && 执行赋值和操作?

Objective-C & Runtime

复杂的 For & If 循环混淆、返回和访问类。 Objective-C

在类的头文件里尽量少引入其它头文件 <<Effective Objective-C>>