Macos 更改popover的contentSize时exc访问错误
我有一个按钮来触发弹出框,弹出框上有一个复选框。复选框的状态复选框绑定到NSManagedObject的字段“checkboxState” 以下是场景:Macos 更改popover的contentSize时exc访问错误,macos,cocoa,exc-bad-access,nspopover,contentsize,Macos,Cocoa,Exc Bad Access,Nspopover,Contentsize,我有一个按钮来触发弹出框,弹出框上有一个复选框。复选框的状态复选框绑定到NSManagedObject的字段“checkboxState” 以下是场景: 我点击按钮,弹出框就会出现 我选中弹出框上的复选框,弹出框会变大,并显示一些其他视图(如果我取消选中复选框,视图将被隐藏,弹出框会恢复到原始大小)复选框状态在此处为“是” 我关闭popover,并执行一些其他操作,将checkboxState更改为NO 我再次单击按钮,然后应用程序挂起大约10秒钟,xcode抛出EXC_BAD_访问(代码=2,
- (IBAction)showPopover:(id)sender {
if (!_myPopover) {
_myPopover = [[NSPopover alloc] init];
_myPopover.delegate = self;
_myPopover.contentViewController = self;
_myPopover.animates = YES;
_myPopover.behavior = NSPopoverBehaviorSemitransient;
_myPopover.appearance = NSPopoverAppearanceMinimal;
}
id theManagedObject = self.myArrayController.selection;
BOOL state = [[theManagedObject valueForKey:@"checkboxState"] boolValue];
if (state) {
_myPopover.contentSize = NSMakeSize(360, 340);
[self.view1 setHidden:NO];
[self.view2 setHidden:NO];
}
else {
[self.view1 setHidden:YES];
[self.view2 setHidden:YES];
_myPopover.contentSize = NSMakeSize(360, 270);
}
[_myPopover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
}
更改对象checkboxState的代码为:
[anManagedObject设置值:@NO-forKey:@checkboxState]
如果我在showPopover中对\u myPopover.contentSize=NSMakeSize(360270)
进行注释;它会起作用的
如果我对[anManagedObject setValue:@NO-forKey:@“checkboxState”]
进行注释,它将起作用
我使用了@try@catch
,没有抛出错误。我使用了配置文件工具,看起来应用程序进入了一个无限循环,并且内存使用量增长非常快。导致此问题的可能调用者是[nsLayoutConstant\u loweredExpressionReportingConstantIsRounded:
和[NSIsObjectiveLinearExpression replaceVariable:withExpression:processVariableNewToReceiver:processVariableDroppedFromReceiver:
有什么想法吗?这个问题我已经解决了一天了。真的需要解决这个问题
编辑:
问题发生在25秒。在那之后,大量的内存被分配了。
从对象列表中,我看到了以下内容,它们被反复调用,直到最后。
当你在带有僵尸模板的Instruments下运行此操作时,你发现了什么?@PeterHosey我没有找到任何具体的内容。也许是因为我不知道如何使用它。通过查看调用方列表,我怀疑它进入了无限循环。我在必要时通过重新创建popover视图解决了这个问题,但我很高兴知道是什么导致了这个问题。如果问题是由发送一个死对象的消息引起的,那么在Zombies下运行它将导致在仪器的时间线中出现一个标志。什么是堆栈跟踪导致您怀疑存在“无限循环”?顺便问一下:
EXC\u BAD\u ACCESS
表示您的进程已死亡。没有任何标志,即使应用程序没有响应,时间线也会继续。我将发布仪器时间线的屏幕截图。