如何修复 Zombie Object 在调用 show window 时抛出 'EXC_BAD_INSTRUCTION'
How to fix Zombie Object throwing 'EXC_BAD_INSTRUCTION' when calling show window
我的程序可视化并绘制模拟神经元的电流以及它们如何相互作用。当我们尝试添加两个以上的神经元进行可视化 2/3 时,程序崩溃并在行上显示 EXC_BAD_INSTRUCTION 错误,该行应显示 window 可以设置单个神经元的参数。
我尝试打开 Zombie Objects 以获取更多信息,但程序不再崩溃,因此我无法获取更多信息。这个问题显然是一个 Zombie Object 问题,我只是不知道如何解决它。
- (IBAction) showParameterSetterWindow:(id)sender
{
if (parameterSetter == nil)
{
ParameterSetter *newParameterSetter = [[ParameterSetter alloc] initWithDefaultWindowNib];
[self setParameterSetter:newParameterSetter];
}
[[self parameterSetter].window orderFront:self]; //Error appears here
} // showSynapseWindow
每个位置的错误是:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
在调试中 window 这是打印出来的:
019-08-05 15:15:04.306293-0400 RoboLobsterSimu[1680:175553] Parameter Setter AwakeFromNIB completed
RoboLobsterSimu(1680,0x10013e5c0) malloc: Heap corruption detected, free list is damaged at 0x60001412b1f0
*** Incorrect guard value: 3
RoboLobsterSimu(1680,0x10013e5c0) malloc: *** set a breakpoint in malloc_error_break to debug
RoboLobsterSimu(1680,0x10013e5c0) malloc: Heap corruption detected, free list is damaged at 0x600014128020
*** Incorrect guard value: 13830554455654793216
RoboLobsterSimu(1680,0x10013e5c0) malloc: *** set a breakpoint in malloc_error_break to debug
warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
如果您需要更多信息来解决问题,请告诉我,谢谢!
这是我被要求添加的代码段。非常感谢!
这里是initWithDefaultWindowNib
- (id)initWithDefaultWindowNib
{
/* AnalysisWindowController *awc;
awc = [super initWithWindowNibName:@"AnalysisWindowController"];
if (!awc)
{
NSLog(@"Warning! Could not load AnalysisWindowController file.\n");
}
else
{
NSLog(@"AnalysisWindowController Nib Loaded");
[awc logAnalysisWindowController];
}
return awc;
*/
if (!self){
self = [super initWithWindowNibName:@"AnalysisWindowController"];
if (self)
{
[self logAnalysisWindowController];
}
else
{
NSLog(@"Warning! Could not load AnalysisWindowController nib.\n");
}
}
return self;
}
在另一个文件中也是这样调用的:
- (id)initWithDefaultWindowNib
{
if (!self){
self = [super initWithWindowNibName:@"ParameterSetter"];
if (self)
{
NSLog(@"Executing InitWithDefaultWIndowNib in Parameter Setter");
}
else
{
NSLog(@"Warning! Could not load ParameterSetter nib.\n");
}
}
return self;
}
对于 setParameterSetter,教授说 "That’s what the synthesize operator does. it creates a setter and getter. setParameterSetter is created as the setter for ParameterSetter. ParameterSetter is the getter"
无论哪种方式,这里是 parameterSetter:
@property (nonatomic, strong) ParameterSetter *parameterSetter;
- (ParameterSetter *)parameterSetter
{
if (parameterSetter == nil)
{
ParameterSetter *newParameterSetter = [[ParameterSetter alloc] initWithDefaultWindowNib];
[self setParameterSetter:newParameterSetter];
}
return parameterSetter;
}
再次感谢
如果有人发现这个,我知道这非常无用,但我只是废弃了整个参数 setter window 并重新构建它,仔细检查每一步的错误和添加的功能。
我的程序可视化并绘制模拟神经元的电流以及它们如何相互作用。当我们尝试添加两个以上的神经元进行可视化 2/3 时,程序崩溃并在行上显示 EXC_BAD_INSTRUCTION 错误,该行应显示 window 可以设置单个神经元的参数。
我尝试打开 Zombie Objects 以获取更多信息,但程序不再崩溃,因此我无法获取更多信息。这个问题显然是一个 Zombie Object 问题,我只是不知道如何解决它。
- (IBAction) showParameterSetterWindow:(id)sender
{
if (parameterSetter == nil)
{
ParameterSetter *newParameterSetter = [[ParameterSetter alloc] initWithDefaultWindowNib];
[self setParameterSetter:newParameterSetter];
}
[[self parameterSetter].window orderFront:self]; //Error appears here
} // showSynapseWindow
每个位置的错误是:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
在调试中 window 这是打印出来的:
019-08-05 15:15:04.306293-0400 RoboLobsterSimu[1680:175553] Parameter Setter AwakeFromNIB completed RoboLobsterSimu(1680,0x10013e5c0) malloc: Heap corruption detected, free list is damaged at 0x60001412b1f0 *** Incorrect guard value: 3 RoboLobsterSimu(1680,0x10013e5c0) malloc: *** set a breakpoint in malloc_error_break to debug RoboLobsterSimu(1680,0x10013e5c0) malloc: Heap corruption detected, free list is damaged at 0x600014128020 *** Incorrect guard value: 13830554455654793216 RoboLobsterSimu(1680,0x10013e5c0) malloc: *** set a breakpoint in malloc_error_break to debug warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
如果您需要更多信息来解决问题,请告诉我,谢谢! 这是我被要求添加的代码段。非常感谢!
这里是initWithDefaultWindowNib
- (id)initWithDefaultWindowNib
{
/* AnalysisWindowController *awc;
awc = [super initWithWindowNibName:@"AnalysisWindowController"];
if (!awc)
{
NSLog(@"Warning! Could not load AnalysisWindowController file.\n");
}
else
{
NSLog(@"AnalysisWindowController Nib Loaded");
[awc logAnalysisWindowController];
}
return awc;
*/
if (!self){
self = [super initWithWindowNibName:@"AnalysisWindowController"];
if (self)
{
[self logAnalysisWindowController];
}
else
{
NSLog(@"Warning! Could not load AnalysisWindowController nib.\n");
}
}
return self;
}
在另一个文件中也是这样调用的:
- (id)initWithDefaultWindowNib
{
if (!self){
self = [super initWithWindowNibName:@"ParameterSetter"];
if (self)
{
NSLog(@"Executing InitWithDefaultWIndowNib in Parameter Setter");
}
else
{
NSLog(@"Warning! Could not load ParameterSetter nib.\n");
}
}
return self;
}
对于 setParameterSetter,教授说 "That’s what the synthesize operator does. it creates a setter and getter. setParameterSetter is created as the setter for ParameterSetter. ParameterSetter is the getter"
无论哪种方式,这里是 parameterSetter:
@property (nonatomic, strong) ParameterSetter *parameterSetter;
- (ParameterSetter *)parameterSetter
{
if (parameterSetter == nil)
{
ParameterSetter *newParameterSetter = [[ParameterSetter alloc] initWithDefaultWindowNib];
[self setParameterSetter:newParameterSetter];
}
return parameterSetter;
}
再次感谢
如果有人发现这个,我知道这非常无用,但我只是废弃了整个参数 setter window 并重新构建它,仔细检查每一步的错误和添加的功能。