gpt4 book ai didi

objective-c - NSString EXC_BAD_ACCESS

转载 作者:搜寻专家 更新时间:2023-10-30 19:43:06 26 4
gpt4 key购买 nike

我坚持使用以下代码。

NSString *gridRef = [[NSString alloc] initWithFormat: @"%@", [converter LatLongToOSGrid: latLong]];
NSLog(@"Grid Ref: %@", gridRef);
self.answerLabel.text = [[NSString alloc] initWithFormat: @"%@", gridRef];

当我记录 gridRef 时,它显示了正确的结果。但是,行设置 answerLabel.text 导致 EXC_BAD_ACCESS 错误并且程序崩溃。 IB 连接到正确的标签,问题是什么?

谢谢


我已经更新了代码如下:

    - (IBAction)convertLatLong {
NSArray *latLong = [[NSArray alloc] initWithObjects: latTextField.text, longTextField.text, nil];

GridRefsConverter *converter = [[GridRefsConverter alloc] init];

NSString *gridRef = [[NSString alloc] initWithFormat: @"%@", [converter LatLongToOSGrid: latLong]];
NSLog(@"Grid Ref: %@", gridRef);
NSLog(@"Label: %@", self.answerLabel.text);
answerLabel.text = @"Yippy";
self.answerLabel.text = gridRef;

[gridRef release];
[converter release];
[latLong release];
}

当 View Controller 被压入堆栈时,answerLabel 通过@property @synthesize 初始化。 (我不知道它是如何初始化的,除了它是 IB 为你做的一件神奇的事情。或者我假设。我在其他 View Controller 中使用了完全相同的方法并且没有遇到这个问题。


我找到了罪魁祸首 - 问题是,我该如何释放它们?

NSString *eString = [[NSString alloc] initWithFormat: @"%f", e];
NSString *nString = [[NSString alloc] initWithFormat: @"%f", n];
eString = [eString stringByPaddingToLength: (digits/2) withString: @"0" startingAtIndex: 0];
nString = [nString stringByPaddingToLength: (digits/2) withString: @"0" startingAtIndex: 0];
NSString *theGridRef = [letterPair stringByAppendingString: eString];
theGridRef = [theGridRef stringByAppendingString: nString];
[eString release];
[nString release];

return theGridRef;

和:

NSArray *gridRef = [[NSArray alloc] init];
gridRef = [gridRef arrayByAddingObject: [NSNumber numberWithDouble: E]];
gridRef = [gridRef arrayByAddingObject: [NSNumber numberWithDouble: N]];
gridRef = [gridRef arrayByAddingObject: [NSNumber numberWithInteger: 8]];

NSString *theGridRef = [[NSString alloc] initWithFormat: @"%@", [self gridRefNumberToLetter: gridRef]];

[gridRef release];
[theGridRef autorelease];

return theGridRef;

最佳答案

您应该通过将环境变量 NSZombieEnabled 设置为 YES 来启用僵尸检测,这样您就可以看到导致错误访问的对象(当您发现错误时不要忘记再次删除它)。

您还可以使用 Instruments 找到对象实际释放的位置。为此,启动一个新的 Instruments session 并使用“Allocations”工具。在仪器设置中勾选“Enable NSZombie detection”和“Record reference counts”。运行 session 时,您将在发生错误的地方中断,并且您会看到所有保留/释放的记录。

如果您的对象被错误释放,您可以在 -viewDidUnload 方法中快速查看一个地方,您应该在其中释放 socket 并将其设置为 nil。如果您忘记了后者并且以某种方式访问​​了 socket ,则会导致 EXC_BAD_ACCESS。

编辑以匹配您的更新:

问题是您正在为 eString(和 nString)分配一个已分配/初始化的新字符串。然后你在下一个语句中覆盖那些,因为-stringByPaddingToLength:(以及所有其他-stringBy... 方法)返回一个新的和自动释放的字符串对象。所以你丢失了对旧字符串的引用,这意味着存在内存泄漏。此外,最后您显式释放了已经自动释放的对象,这会导致您访问错误。

相反,你应该从头开始创建自动释放的字符串([NSString stringWithFormat:...])并且不要在最后释放它们。

关于objective-c - NSString EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3590735/

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