【发布时间】:2012-02-08 10:50:08
【问题描述】:
请帮忙,我被 Objective-c 全局变量(又名 extern)卡住了! 我编写了我的第一个 iOS 应用程序,它是一个游戏,所以为了保存我的进度,我在 Globals.h 中编写了一些全局变量:
@interface Globals : NSObject
extern float square;
extern float field;
extern float dx;
extern float dy;
extern NSURL *documentsUrl;
extern NSURL *dbUrl;
extern NSString *savePath;
extern FMDatabase *db;
@end
和 Globals.m:
#import "Globals.h"
@implementation Globals
float square;
float field;
float dx;
float dy;
NSURL *documentsUrl;
NSURL *dbUrl;
NSString *savePath;
FMDatabase *db;
+(void)initialize
{
static BOOL initialized = NO;
if (!initialized)
{
initialized = YES;
square = 177.7778;
field = 146.0;
dx = 105;
dy = 58.5;
documentsUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
dbUrl = [documentsUrl URLByAppendingPathComponent:@"alias.sql"];
[[NSFileManager defaultManager] copyItemAtURL:[[NSBundle mainBundle] URLForResource:@"alias" withExtension:@"sql"] toURL:dbUrl error:nil];
savePath = [[documentsUrl URLByAppendingPathComponent:@"save.plist"] path];
db = [FMDatabase databaseWithPath:[dbUrl path]];
//db.logsErrors = YES;
//db.traceExecution = YES;
if (![db open]) {
NSLog(@"Could not open db.");
}
}
}
@end
我确保初始化方法在应用启动时至少执行一次。在 MainViewController 中,这是我在 viewDidLoad 方法中使用的 RootViewController:
[GameInfo hasSave];
这是 GameInfo 类中的静态方法,如下所示:
+(BOOL)hasSave
{
return [[NSFileManager defaultManager] fileExistsAtPath: savePath];
}
当我跟踪它时,savePath 类似于:
/Users/Apple/Library/Application Support/iPhone Simulator/5.0/Applications/472969F1-3760-4C74-8C8D-29681F47F4CB/Documents/save.plist
然后我在同一个视图中执行 IBAction on Touch up,同时看起来像:
if ([GameInfo hasSave])
{
[GameInfo load];
}
当我在方法 hasSave 中迈出一步时,我有一些奇怪的 savePath 值:
ar.lproj
我的方法当然返回 NO。但它不仅发生在我的 savePath 中,而且发生在所有其他外部变量中。有时它们是正确的,但有时却不是。 我想也许问题出在我使用它们的地方,也许我忘了做点什么。请帮帮我。
P.S.:对不起我的英语和一个大问题。
【问题讨论】:
标签: iphone objective-c sdk global-variables extern