我正在尝试使用这段代码在我的应用程序中切换 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
这样我就可以按照我的命令释放所有东西。现在代码可以工作了。再次感谢!
最佳答案
我建议您将 variable1
、variable2
和 variable3
声明为属性,而不是实例变量。然后,使用 self.variable1
、self.variable2
和 self.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:
发送到该对象,该对象将返回一个已初始化的对象,该对象可以而且很可能是一个不同的对象。现在您拿着一个未初始化的对象(稍后您将尝试使用它)并将已初始化的对象丢在地板上。
永远,永远,永远不要在单独的表达式中发送 alloc
和 init
(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/