gpt4 book ai didi

ios - 为什么在使用 ARC 时此代码会导致 EXC_BAD_ACCESS?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:56 26 4
gpt4 key购买 nike

我正在将一个旧的 iPhone 项目转换为使用 ARC。我正在展示一个模态视图 Controller 并在关闭它时获得 EXC_BAD_ACCESS - 无法弄清楚为什么,我怀疑我遗漏了一些关于 ARC 工作原理的基本知识。

被呈现的 View Controller 是 CorrectionsController,它使用委托(delegate)来让其呈现的 View Controller 知道将其关闭。这些是头文件中的相关位:

@protocol CorrectionsControllerDelegate
- dismissCorrectionsController;
@end

@property (nonatomic, weak) id<CorrectionsControllerDelegate> correctionsDelegate;

Controller 在这个方法中被初始化:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil delegate:(id<CorrectionsControllerDelegate>)_delegate {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
self.correctionsDelegate = _delegate;
// do other init stuff
}
return self;
}

关闭按钮调用此方法:

- (void)cancelCorrection {
if (self.correctionsDelegate)
[self.correctionsDelegate dismissCorrectionsController];
// EXC_BAD_ACCESS happens here
}

呈现 View Controller 像这样初始化 CorrectionsController:

// in .h file
@property (nonatomic, strong) CorrectionsController *corrections;
@property (nonatomic, strong) UINavigationController *secondNavigationController;

// in .m file
NSString *nibName = @"CorrectionsController";
self.corrections = [[CorrectionsController alloc] initWithNibName:nibName bundle:nil delegate:self];
self.secondNavigationController = [[UINavigationController alloc] initWithRootViewController:self.corrections];
if (isiPad()) {
self.secondNavigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}
[self presentViewController:self.secondNavigationController animated:YES completion:nil];

它实现了 CorrectionsControllerDelegate 协议(protocol):

- (void)dismissCorrectionsController {
[self dismissViewControllerAnimated:TRUE completion:nil];
}

现在,有趣的部分。单步执行代码时,执行流入cancelCorrection,进入delegate中的dismissCorrectionsController,返回到cancelCorrection,在cancelCorrection的endEXC_BAD_ACCESS。

enter image description here

enter image description here

self.correctionsDelegate 似乎始终指向一个有效对象(在 Variables View 中检查它显示了我期望的对象和值,并且我在控制台中得到了以下看起来不错的内容)。

(lldb) po self.correctionsDelegate
<SyncController: 0x17b9a970>

真正让我困惑的部分:

1) 堆栈跟踪显示 EXC_BAD_ACCESS 发生在 objc_retain 内部。 为什么?这里保留了什么?

2) 0x44内存地址指的是什么?

最佳答案

目前我能找到的最好的解释是模态 Controller (CorrectionsController)似乎在dismissCorrectionsController中被立即释放,当执行返回到cancelCorrection时就不再有效了。此更改似乎解决了崩溃问题:

- (void)cancelCorrection {
[self.correctionsDelegate performSelector:@selector(dismissCorrectionsController) ];
}

我会将这个答案标记为已接受,但它对我来说仍然没有完全意义,所以如果有人对正在发生的事情有更好的解释,我会很乐意接受那个答案。

关于ios - 为什么在使用 ARC 时此代码会导致 EXC_BAD_ACCESS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com