2010-07-11 44 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数组与对象一起使用。你什么也得不到,你必须像鹰一样来看他们,以防止出现错误。