Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 当我关闭我的窗口(也是我的应用程序)时,会出现错误访问;s代表_Macos_Cocoa_Xcode4_Exc Bad Access_Automatic Ref Counting - Fatal编程技术网

Macos 当我关闭我的窗口(也是我的应用程序)时,会出现错误访问;s代表

Macos 当我关闭我的窗口(也是我的应用程序)时,会出现错误访问;s代表,macos,cocoa,xcode4,exc-bad-access,automatic-ref-counting,Macos,Cocoa,Xcode4,Exc Bad Access,Automatic Ref Counting,我编写了一个Cocoa应用程序,在关闭应用程序窗口时,出现了EXC\u BAD\u ACCESS错误。我读到这个错误通常意味着内存问题,但我打开了ARC模式,我不需要担心释放e.t.c.(xCode禁止我调用这个函数并自动管理内存) 错误指向行返回NSApplicationMain(argc,(const char**)argv)在主功能中 以下是我的应用程序代码: .h文件: @interface MainDreamer : NSWindow <NSWindowDelegate>

我编写了一个Cocoa应用程序,在关闭应用程序窗口时,出现了
EXC\u BAD\u ACCESS
错误。我读到这个错误通常意味着内存问题,但我打开了
ARC模式
,我不需要担心释放e.t.c.(xCode禁止我调用这个函数并自动管理内存)

错误指向行
返回NSApplicationMain(argc,(const char**)argv)在主功能中

以下是我的应用程序代码:

.h文件:

@interface MainDreamer : NSWindow <NSWindowDelegate> 
{    
    NSTextField *dreamField;
    NSTableView *dreamTable;    
    NSImageView *dreamview;

    NSMutableArray *dreamlist;  
    NSMutableArray *dataset;
}

@property (nonatomic, retain) IBOutlet NSTextField *dreamField;
@property (nonatomic, retain) IBOutlet NSTableView *dreamTable;
@property (nonatomic, retain) IBOutlet NSImageView *dreamview;
@property (nonatomic, retain) IBOutlet NSMutableArray *dreamlist;
@property (nonatomic, retain) IBOutlet NSMutableArray *dataset;
@property (assign) IBOutlet NSWindow *window;

@end

然而,在我把它放进评论之后,这个僵尸事件继续发生

对于ARC,您应该使用
而不是
保留
分配
这是错误的:

dataset = [[NSMutableArray alloc] init]; // WRONG
dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
为什么??首先分配一个空数组,并将其存储在实例变量
dataset
中。但在下一行中,您将使用
+unarchiveObjectWithFile:
返回的内容替换空数组。为什么这是一个问题?嗯,如果您阅读文档,您将看到如果找不到文件,它将返回
nil
。这意味着您现在将空数组替换为
nil
,并且您发送到
dataset
的所有消息都将被忽略(在Objective-C中,发送到nil的消息将被默默忽略)

我假设您确实希望从文件加载数据集,并且只有在失败时,才从空数据集开始:

dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
if (dataset==nil) dataset = [[NSMutableArray alloc] init];
稍后会出现类似错误:

Dream *dr = [[Dream alloc] init]; // WRONG
dr = [dataset objectAtIndex:index];
创建一个Dream对象,然后立即用数据集中的内容替换它。你真正想做的是:

Dream *dr;
dr = [dataset objectAtIndex:index];
或更短:

Dream *dr = [dataset objectAtIndex:index];
同样,您可以使用循环的快速枚举样式替换while循环:

    for (Dream *dr in dataset) {
        [dreamlist addObject: dr.dreamname];         
    }
最后,我要说的是,我不认为EXC_BAD_访问实际上发生在main.h中。我假设您使用的是Xcode 4。调试时,请使用右侧栏中的线程/堆栈导航器查找错误发生的实际位置


这可能是因为在
应用程序中实际发生的错误将终止:
,因为您试图存档
数据集
,这可能是
,并且可能不允许存档

。崩溃是由于您将窗口作为应用程序的委托而导致的。当您关闭窗口时,这是关闭它的最后一个版本,如果这是您打开的最后一个窗口,它会导致应用程序询问其委托人是否应该退出。由于您刚刚关闭的窗口是应用程序的委托,因此会发生崩溃


ARC不会阻止您创建弱引用,如果它们未被置空,则在发布后可以访问弱引用。您已经使用弧前说明符声明了属性(保留ad而不是strong等)。标准建议适用-启用僵尸并查看哪个对象正在接收消息。@jrturton,如何启用僵尸?转到菜单“产品->配置文件”。Xcode将构建您的产品并在仪器中运行。过了一会儿,仪器窗口弹出。选择“僵尸”模板并点击“档案”。它帮助我找到僵尸事件。我更新了我的初始帖子,我认为问题可能是行
@property(assign)ibnswindow*窗口。你能解释一下这是做什么用的吗?是否使用interface builder将此窗口链接到自身?如果是那样的话,你只需要
self
,谢谢你的详细回答。我更正了您所说的一切,并检查了
dataset
是否为
nil
。然而,
EXC\u坏访问
继续发生。在调试导航器中有
线程1
,其中会触发错误(在
14 main
中)。我添加了
异常断点
,但它没有被激活。如何找到错误显示的实际位置?在侧边栏的底部,有一个滑块,可以选择显示哪些堆栈帧。将其一直拖到右侧。然后您将看到所有堆栈帧。您可以查看问题发生的位置。问题可能发生在苹果框架内的某个地方(内存管理问题不会立即导致错误是很常见的…)我使用profile并发现了一个僵尸事件,它的调用者是
checkForTerminateAfterLastWindowClosed
。我更新了我的帖子,你可以在那里看到更多。尤其是后者:
weak
是一个归零弱引用,当引用对象死亡时,它会自动设置回
nil
assign
safe\u unrepaired
同义,这是一个*非-*归零弱引用,即使在对象死亡后,
assign
/
safe\u unrepaired
属性仍将继续指向它。一定要用
不安全_unretained
替换
assign
的每一个用法,并且只有在你有非常非常非常好的理由的情况下才使用后者。但是,我应该补充一点,某些类的实例不能被弱引用。NSWindow就是其中之一。您必须对引用窗口的属性使用
unsafe\u unretained
(或
assign
,或
strong
/
retain
)。请参阅转换为ARC发行说明中的常见问题:
Dream *dr;
dr = [dataset objectAtIndex:index];
Dream *dr = [dataset objectAtIndex:index];
    for (Dream *dr in dataset) {
        [dreamlist addObject: dr.dreamname];         
    }