首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Extern的神秘问题

Extern的神秘问题
EN

Stack Overflow用户
提问于 2011-04-25 14:11:23
回答 2查看 440关注 0票数 1

在我的项目中,我定义了AuxState.h

代码语言:javascript
复制
extern NSString *kStrAgentStateLogin;
extern NSString *kStrAgentStateAvailable;
extern NSString *kStrAgentStateLogOff;
extern NSString *kStrAgentStateLunch;
extern NSString *kStrUnavailable_IDLE;

AuxState.m

代码语言:javascript
复制
NSString *kStrAgentStateLogin; 
NSString *kStrAgentStateAvailable;
NSString *kStrAgentStateLunch;
NSString *kStrAgentStateLogOff;
NSString *kStrUnavailable_IDLE;

在我的应用程序.m中,我导入了AuxState.h,并定义了以下方法,该方法设置了extern变量

代码语言:javascript
复制
-(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变量在整个代码中都有作用域。神秘的是什么。有人吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-25 14:25:51

如果您没有在垃圾收集下运行,那么第一部分代码需要保留这些字符串。否则,在您分配它们之后不久,它们就会被解除分配,并且您将得到指向已分配对象的指针。这是获得EXC_BAD_ACCESS崩溃的一个很好的方法。

票数 2
EN

Stack Overflow用户

发布于 2011-04-25 14:29:37

尽管这些extern变量的生存期确实与程序相同,但它们所指向的对象不一定是这样的:

代码语言:javascript
复制
kStrAgentStateLogin = @"ログイン";

rvalue是一个文本(或常量) NSString,运行时从未释放它,因此您不必担心对该字符串的内存管理。

代码语言:javascript
复制
kStrAgentStateLogin=[[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:kAuxStatesDictFile ofType:@"plist"]] allKeysForObject:kStrAgentStateLogin] objectAtIndex:0];

rvalue是一个您不拥有的字符串(也就是说,您还没有通过NARC方法获得它--新的、指定的、保留的、复制的),所以您不能期望它在整个程序的执行过程中存在。您应该使用-retain来拥有该字符串,确保它在整个程序中都是有效的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5779201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档