2010-07-11 43 views
0

我宣佈iPhone的NSString陣列

NSString *dayinfield[43]; 

-(void)DrawDemo { 
dayinfield[2] = @"hallo"; 
dayinfield[3] = @"test"; 

// also i can read it 
NSLog (@"show: %@",dayinfield[2]); 
//works fine 
} 

填滿它,但是當我置身於另一個函數讀取其內容(同一類)

-(void)ReadData 
{ 
NSLog (@"show: %@",dayinfield[2]); 
// I get random infos or 「EXC_BAD_ACCESS 
} 

怎麼辦我初始化NSString數組是正確的,所以我可以在每個函數中獲得它的內容?

感謝 克里斯

+2

你確定'-DrawDemo'在'-ReadData'之前被調用嗎? – 2010-07-11 17:47:15

+0

'dayinfield'在哪裏聲明 - 它真的是伊娃嗎? – 2010-07-11 18:35:24

回答

1

如果你只給數組元素指定文字,這應該不成問題。但是,如果使用其他字符串,則必須在使用C數組時手動保留這些實例。

順便說一下:Objective-C方法以小寫字母開頭。

+0

thx記住小寫字母..甚至現在做了:)但我的字符串數組的概率仍然存在。任何簡短的演示甚至還有其他的東西歡迎>我只需要一個nsstrings數組,我可以從我的課中的任何地方填充和閱讀:) – 2010-07-11 18:07:41

0

,如果你從來沒有初始化數組(或它的您正在訪問的部分)這會發生 - 如果你還沒有-ReadData之前調用-DrawDemo或使用不同的指標比張貼在這裏的人,該數組只會包含垃圾值。

嘗試在初始化程序方法中將數組內容初始化爲nil@"",並查看問題是否仍然存在。

或者考慮使用合適的可可容器。

+0

確實DrawDemo在ReadData之前,正如DrawDemo中提到的那樣,我可以讀取Data完美的,就在另外一個函數的外部,它只是解除分配...... ??任何短的演示甚至還有其他的東西歡迎>我只需要一個nsstrings的數組,我可以從我的課中的任何地方填充和閱讀:) – 2010-07-11 18:05:35

+1

@christian:在那裏,快速和骯髒:http://pastebin.com/jyYaVNxm – 2010-07-11 18:33:37

+1

由方式,你可以在'-DrawDemo'中讀取它,但不在'-ReadData'中讀取它,這正是我認爲'-DrawDemo'可能不會被首先調用的原因。 – 2010-07-11 18:57:32

0

它的內存可能會在第二次調用之前被釋放。假設您已將dayinfield宣佈爲法醫(並且事實上您始終沒有錯誤訪問),則您的字符串未被正確保留。

初始化字符串是這樣的:

dayinfield[2] = [[NSString alloc] initWithString:@"hallo"]; 
dayinfield[3] = [[NSString alloc] initWithString:@"test"]; 

和你下課後是被釋放(見Memory Management Guide),你應該釋放他們。

另外,顯然這取決於你想要做什麼,但是如果你使用NSArray而不是C數組,它可能會更容易。

+0

@Mo:'var = [@「hello」retain];'也是完全有效的。 – 2010-07-11 17:56:16

+1

字符串文字不會在您下面被釋放(請參閱[這裏](http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html)):*「編譯器使得這些對象常量在每個模塊的基礎上是唯一的,並且它們永遠不會被釋放,儘管您可以像其他對象一樣保留和釋放它們。「*。 – 2010-07-11 17:57:11

+0

+1對你的一些隨機答案,因爲我不能讚揚這個評論! – 2010-07-11 18:02:46

0

你在OP中有什麼應該工作,雖然它是純粹的受虐狂運動中使用老式C數組與對象。

我跑這個代碼:

@interface TestClass : NSObject { 
    NSString *a[1]; 
} 
- (void) drawDemo; 
- (void) readData; 
@end 

@implementation TestClass 

- (void) drawDemo{ 
    a[0][email protected]"A Zero"; 
    a[1][email protected]"A One"; 
}//------------------------------------- (void) drawDemo------------------------------------ 

- (void) readData{ 
    NSLog(@"a[0]=%@,a[1]=%@",a[0],a[1]); 
}//------------------------------------- (void) readData------------------------------------ 

@end 

TestClass *tc=[[TestClass alloc] init]; 
[tc drawDemo]; 
[tc readData]; 

...並得到了這個輸出:

a[0]=A Zero,a[1]=A One 

你的問題是其他地方在你的代碼。沒有令人信服的理由將C數組與對象一起使用。你什麼也得不到,你必須像鷹一樣來看他們,以防止出現錯誤。