在我的项目中,我定义了AuxState.h
extern NSString *kStrAgentStateLogin;
extern NSString *kStrAgentStateAvailable;
extern NSString *kStrAgentStateLogOff;
extern NSString *kStrAgentStateLunch;
extern NSString *kStrUnavailable_IDLE;在AuxState.m中
NSString *kStrAgentStateLogin;
NSString *kStrAgentStateAvailable;
NSString *kStrAgentStateLunch;
NSString *kStrAgentStateLogOff;
NSString *kStrUnavailable_IDLE;在我的应用程序.m中,我导入了AuxState.h,并定义了以下方法,该方法设置了extern变量
-(void) languageSetupForAuxStates
{
/* 1st Part */
kStrAgentStateLogin = @"Log In";
kStrAgentStateAvailable = @"Available";
kStrAgentStateLunch = @"Lunch";
kStrAgentStateLogOff = @"Log Off";
kStrUnavailable_IDLE = @"Unavailable/IDLE";
if([[[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0] isEqualToString:@"ja"]){
kStrAgentStateLogin=[[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kAuxStatesDictFile ofType:@"plist"]] allKeysForObject:kStrAgentStateLogin] objectAtIndex:0];
kStrAgentStateAvailable=[[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kAuxStatesDictFile ofType:@"plist"]] allKeysForObject:kStrAgentStateAvailable] objectAtIndex:0];
kStrAgentStateLunch=[[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kAuxStatesDictFile ofType:@"plist"]] allKeysForObject:kStrAgentStateLunch] objectAtIndex:0];
kStrUnavailable_IDLE=[[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kAuxStatesDictFile ofType:@"plist"]] allKeysForObject:kStrUnavailable_IDLE] objectAtIndex:0];
}
NSLog(@"kStrAgentStateLunch = %@",kStrAgentStateLunch);
/* 2nd Part */
if([[[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0] isEqualToString:@"ja"]){
NSLog(@"Agent language is Japan");
kStrAgentStateLogin = @"ログイン";
kStrAgentStateAvailable = @"利用可能";
kStrAgentStateLunch = @"昼食";
kStrAgentStateLogOff = @"ログオフ";
kStrUnavailable_IDLE = @"できない/アイドル";
}
else {
NSLog(@"Agent language is English");
kStrAgentStateLogin = @"Log In";
kStrAgentStateAvailable = @"Available";
kStrAgentStateLunch = @"Lunch";
kStrAgentStateLogOff = @"Log Off";
kStrUnavailable_IDLE = @"Unavailable/IDLE";
}
}现在,在这两种情况下读取的值是相同的。我也通过做NSLog来检查它们。所以从夹板上读没有问题。
如果我使用的是第二部分,结果是预期的和外部是公认的到处。:)
如果我使用第一部分,问题是我收到了"EXC_BAD_ACCESS“:(无论我在哪里访问这些外部值,如果我将鼠标放在调试模式中的变量上,我可以看到它打印”超出作用域“,但是extern变量在整个代码中都有作用域。神秘的是什么。有人吗?
发布于 2011-04-25 14:25:51
如果您没有在垃圾收集下运行,那么第一部分代码需要保留这些字符串。否则,在您分配它们之后不久,它们就会被解除分配,并且您将得到指向已分配对象的指针。这是获得EXC_BAD_ACCESS崩溃的一个很好的方法。
发布于 2011-04-25 14:29:37
尽管这些extern变量的生存期确实与程序相同,但它们所指向的对象不一定是这样的:
kStrAgentStateLogin = @"ログイン";rvalue是一个文本(或常量) NSString,运行时从未释放它,因此您不必担心对该字符串的内存管理。
kStrAgentStateLogin=[[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kAuxStatesDictFile ofType:@"plist"]] allKeysForObject:kStrAgentStateLogin] objectAtIndex:0];rvalue是一个您不拥有的字符串(也就是说,您还没有通过NARC方法获得它--新的、指定的、保留的、复制的),所以您不能期望它在整个程序的执行过程中存在。您应该使用-retain来拥有该字符串,确保它在整个程序中都是有效的。
https://stackoverflow.com/questions/5779201
复制相似问题