2010-04-17 70 views
3

这是我的iPhone的代码(非常)的简化版本:我得到一个 “EXC_BAD_ACCESS” 当我尝试读取的NSString

@interface X {
的NSString *名1;
NSString * name2;
}

-init {
name1 = @“”;
name2 = @“”;
}

- (无效)一个{
美孚*富= [美孚的alloc];
name1 = @“uhuh”;
name2 = [foo bar]; //返回一个(NSString *)
[foo release];
}

- (无效)B {
的NSLog(@ “%@”,NAME1); //它的工作原理
NSLog(@“%@”,name2); //那里我得到一个EXC_BAD_ACCESS ...
}

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

编辑:我探微解决problème,我忘了“保留” ......

回答

0

昨天我得到一个EXC_BAD_ACCESS错误。事实证明,我打电话release在一个对象,导致它被删除,然后我试图使用它。

你不打电话release对任何你不应该是你?

只是一个友好的提醒:如果你不打电话allocretain对象,你不叫release。随着你提供的代码,它不会出现这是问题。但我想指出这一点以防万一。

0

乔尔是正确的。 试着看看你的[foo bar]功能,可能是在这个功能中你释放任何物体

1

你需要阅读Cocoa Memory Management Guide

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

例如:

[Foo alloc]; 

你不能初始化 '富'。通常将allocinit调用连接在一起,例如:[[Foo alloc] init];这将确保对象成员和状态是您在创建后所期望的。

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

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

原因name1正在工作是因为在Cocoa中使用字面@“”字符串的特殊考虑。当像这样使用字符串时,它变成'内化的'。如果您创建两个包含相同文本的文字字符串,系统将优化它,以便这两个字符串指向内存中的一个对象。

也就是说,如果你有一些代码看起来是这样的:

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

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

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

相关问题