gpt4 book ai didi

iphone - 当我尝试读取 NSString 时得到 "EXC_BAD_ACCESS"

转载 作者:行者123 更新时间:2023-12-03 20:11:12 26 4
gpt4 key购买 nike

这是我的 iPhone 代码的(非常)简化版本:

@interface x {
NSString * name1;
NSString * name2;
}

-init {
name1 = @"";
name2 = @"";
}

-(void) a {
Foo * foo = [Foo alloc];
name1 = @"uhuh";
name2 = [foo bar]; // return a (NSString *)
[foo release];
}

-(void) b {
NSLog(@"%@", name1); // it works
NSLog(@"%@", name2); // there I get an EXC_BAD_ACCESS...
}

为什么我会遇到这个问题?我该如何解决它?
谢谢!

编辑:我只是解决了问题,我忘记了“保留”...

最佳答案

您需要阅读 Cocoa Memory Management Guide

您在代码中所做的一些事情表明您没有掌握 cocoa 内存管理的基本概念。

例如:

[Foo alloc];

您没有初始化“foo”。将 allocinit 调用结合在一起是常见的做法,例如: [[Foo alloc] init]; 这将确保对象成员和状态就是您创建后所期望的。

name2 = [foo bar]; // returns a (NSString *)

bar 方法可能返回一个 autoreleased 字符串。在将其分配给 name2 后,您不会保留它,因此它将在方法返回后一段时间被释放。这就是你的代码崩溃的原因。您正在尝试访问已解除分配的对象。 name2 指向的对象已被释放并释放,但指针未设置为 nil,这意味着它指向的内存现在可以包含任何内容。未定义。

name1 起作用的原因是由于在 Cocoa 中使用文字 @""字符串的特殊考虑。当像这样使用字符串时,它就变成了“内部化”。如果您创建两个包含相同文本的文字字符串,系统将对其进行优化,以便这两个字符串都指向内存中的一个对象。

也就是说,如果您的代码如下所示:

NSString *myString1 = @"hello";
NSString *myString2 = @"hello";

NSLog(@"string1: %p, string2: %p", myString1, myString2);

这将导致一条消息如下:string1: 0x123456, string2: 0x123456。这里需要注意的重要一点是内存地址是相同的。这些字符串指向同一个对象,即使它们是代码中的不同实例。

关于iphone - 当我尝试读取 NSString 时得到 "EXC_BAD_ACCESS",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659832/

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