ios - 使用 PresentModalViewController 更改 View 时出现 EXC_BAD_ACCESS 错误

标签 ios cocoa-touch uikit exc-bad-access

我正在尝试使用这段代码在我的应用程序中切换 View :

self->variable1 = [[NSNumber alloc] initWithInt:0];
self->variable2 = [[NSMutableArray arrayWithCapacity:1];
self->variable3 = [[NSMutableArray arrayWithCapacity:1];

[self presentModalViewController:titleScreen animated:YES];

如果我注释掉所有分配的变量行,代码就可以正常工作。如果它在代码中只留下 1 行,则会因“EXC_BAD_ACCESS”错误而崩溃。为什么会这样?这些变量根本没有被使用,只是声明供以后使用。我也没有收到任何编译错误。我做错了什么?

更新:
谢谢大家的帮助。我将声明变量的方式更改为 @property/@synth 以清理我的代码,但这并没有解决问题。经过长时间的摆弄,我修复了它。我更改了代码:

self.variable1 = [[NSNumber alloc] initWithInt:0];

为此:

self.variable1 = [NSNumber alloc];
[self.variable1 initWithInt:0];

成功了!有人可以解释为什么这行得通而第一行行不通吗?

更新:

谢谢 Peter Hosey 向我展示了我的邪恶方式。这次我很确定它是固定的。我将变量 Releases 存储在

-(void)release

我没有意识到 xCode 会在需要时发布。我将所有变量版本移至

-(void)Destroy

这样我就可以按照我的命令释放所有东西。现在代码可以工作了。再次感谢!

最佳答案

我建议您将 variable1variable2variable3 声明为属性,而不是实例变量。然后,使用 self.variable1self.variable2self.variable3 访问它们。

点语法(self.variable1 等)使用您在每个属性上声明的内存管理策略;箭头语法(self->variable1 等)将直接访问变量。崩溃是因为您在 away 中创建了两个数组,但您没有拥有它们,然后没有将数组分配给将保留它们的属性。

您可能还想升级您的项目以使用 ARC。那么就没有内存管理差异;分配给实例变量而不是属性不会导致对象过早释放,因为默认情况下 ARC 认为实例变量是所有权。在切换到 ARC 后,您可能仍想切换到使用属性,但不是为了防止崩溃。


响应您的编辑:

I change the way I declare my variables to @property/@synth to clean up my code, but it didn't fix the problem.

然后其他地方出了问题。

你从来没有对问题本身说太多。您说您得到了 EXC_BAD_ACCESS,但没有说明是什么语句触发了崩溃,也没有说明您将崩溃归咎于您显示的代码的原因。

I changed the code from this:

self.variable1 = [[NSNumber alloc] initWithInt:0];

不过,这是正确的代码。这就是您应该使用的。

to this:

self.variable1 = [NSNumber alloc];
[self.variable1 initWithInt:0];

不!该代码在多个层面上都是错误的,错误的,错误的。

init 方法(包括 initWithWhatever: 方法)不保证返回您将消息发送到的同一对象。 NSNumber 的 initWithInt: 很可能没有

该对象创建一个未初始化 NSNumber 对象并将其分配给该属性。然后它将 initWithInt: 发送到该对象,该对象将返回一个已初始化的对象,该对象可以而且很可能是一个不同的对象。现在您拿着一个未初始化的对象(稍后您将尝试使用它)并将已初始化的对象丢在地板上。

永远,永远,永远不要在单独的表达式中发送 allocinit(With...)。始终以相同的表达方式发送它们。没有异常(exception)。否则,您可能持有未初始化的对象而不是已初始化的对象。在您的情况下(使用 NSNumbers),这几乎肯定会发生。

您应该做的是声明和合成一个拥有 NSNumber 对象的强属性,并在单个语句中创建 NSNumber 对象:[[NSNumber alloc] initWithInt:][NSNumber numberWithInt:]。如果你不使用 ARC,你会想要后者,因为该属性将保留对象。如果您使用的是 ARC,它们实际上是等效的。

如果您使用该代码发生崩溃,那么其他地方出了问题,所以请在这个问题或新问题中告诉我们有关崩溃的信息,以便我们帮助您找到真正的原因。

关于ios - 使用 PresentModalViewController 更改 View 时出现 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8438504/

相关文章:

ios - 即使在更改文本后,我的 UILabel 也始终为零。我怎么能让我的 UILabel 不为零?

ios - 从 UITapGestureRecognizer 中查找被点击的 UIImageview

ios - 使用自定义布局制作共享扩展

ios - 将触摸事件从 View 发送到 Controller

objective-c - 如何将 Facebook 粉丝页面集成到 iPhone 应用程序中?

iphone - UITextField setAutocapitalizationType 奇怪的行为

IOS UIActivityViewController

iphone - TableView 中的 UIAccessibilityContainer

ios - 解除模态呈现的 View Controller 时框架不正确

iOS 容器 View 不支持 intrinsicContentSize