Iphone 我得到了一个;EXC“不良访问”;当我试图读取一个字符串时

Iphone 我得到了一个;EXC“不良访问”;当我试图读取一个字符串时,iphone,nsstring,exc-bad-access,Iphone,Nsstring,Exc Bad Access,这是我的iPhone代码的(非常)简化版本: @接口x{ NSString*name1; NSString*name2; } -初始化{ 名称1=@“; 名称2=@“; } -(无效)a{ Foo*Foo=[Foo alloc]; 名称1=@“uhuh”; name2=[foo bar];//返回一个(NSString*) [foo release]; } -(无效)b{ NSLog(@“%@”,name1);//它可以工作 NSLog(@“%@”,name2);//在那里我得到了一个EXC\u

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

@接口x{
NSString*name1;
NSString*name2;
}

-初始化{
名称1=@“;
名称2=@“;
}

-(无效)a{
Foo*Foo=[Foo alloc];
名称1=@“uhuh”;
name2=[foo bar];//返回一个(NSString*)
[foo release];
}

-(无效)b{
NSLog(@“%@”,name1);//它可以工作
NSLog(@“%@”,name2);//在那里我得到了一个EXC\u BAD\u访问…
}

为什么我会有这个问题?我怎样才能解决它呢?
谢谢


编辑:我刚刚解决了这个问题,我忘记了一个“保留”…

昨天我遇到了一个EXC_BAD_访问错误。结果是我对一个对象调用了
release
,导致它被删除,然后我尝试使用它

你没有对任何你不应该做的事情调用
release
,是吗

只是一个友好的提醒:如果您没有对对象调用
alloc
retain
,您就不会调用
release
。根据您提供的代码,似乎这不是问题所在。但我想指出这一点以防万一。乔尔是对的。 尝试查看[foo bar]函数,可能是在该函数中,您正在释放任何需要读取的对象

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

例如:

[Foo alloc];
你不是在初始化“foo”。将
alloc
init
调用耦合在一起是常见的做法,例如:
[[Foo alloc]init]这将确保对象成员和状态与创建后的预期一致

name2 = [foo bar]; // returns a (NSString *)
bar
方法可能会返回一个
自动删除的
字符串。在将它分配给
name2
之后,您不会保留它,因此它将在方法返回后的某个时间被释放。这就是你的代码崩溃的原因。您正在尝试访问解除分配的对象。name2
指向的对象已释放并解除分配,但指针未设置为nil,这意味着它指向的内存现在可以包含任何内容。没有定义

之所以
name1
有效,是因为在Cocoa中使用literal@“”字符串需要特别考虑。当像这样使用字符串时,它会被“内部化”。如果创建两个包含相同文本的文本字符串,系统将对其进行优化,以便这两个字符串都指向内存中的一个对象

也就是说,如果您有如下代码:

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

NSLog(@"string1: %p, string2: %p", myString1, myString2);
这将导致出现如下消息:
string1:0x123456,string2:0x123456
。这里需要注意的重要一点是,内存地址是相同的。字符串指向同一个对象,即使它们在代码中是不同的实例