2010-04-17 68 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。這裏要注意的重要一點是內存地址是相同的。字符串指向同一個對象,即使它們是代碼中的不同實例。

相關問題