Iphone Objective-c外部变量变化

Iphone Objective-c外部变量变化,iphone,objective-c,sdk,global-variables,extern,Iphone,Objective C,Sdk,Global Variables,Extern,请帮忙,我被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 N

请帮忙,我被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
我估计initialize方法在应用程序启动时至少执行一次。在MainViewController中,这是我在viewDidLoad方法中使用的RootViewController:

[GameInfo hasSave];
这是GameInfo类中的静态方法,如下所示:

+(BOOL)hasSave
{
    return [[NSFileManager defaultManager] fileExistsAtPath: savePath];
}
if ([GameInfo hasSave])
{
    [GameInfo load];
}
当我跟踪它时,保存路径类似于:

/用户/Apple/Library/Application Support/iPhone Simulator/5.0/Applications/472969F1-3760-4C74-8C8D-29681F47F4CB/Documents/save.plist

但是我在同一个视图中执行IBAction on Touch up inside,在同一时间,看起来像:

+(BOOL)hasSave
{
    return [[NSFileManager defaultManager] fileExistsAtPath: savePath];
}
if ([GameInfo hasSave])
{
    [GameInfo load];
}
当我在方法hasSave中进行步骤时,我有一些奇怪的保存路径值:

阿尔普洛伊酒店

我的方法当然会返回NO,但它不仅会出现在我的savePath中,还会出现在所有其他外部变量中。有时他们是正确的,但有时他们不是。 我想问题可能是我在哪里使用它们,也许我忘了做些什么。请帮帮我


注意:对不起,我的英语和一个巨大的错误。

要消除垃圾值,您应该在全局变量的实例化中初始化它们:

NSString *mySavePathString = nil;

您还需要确保显式保留(和释放)分配给全局变量的所有对象。(示例中是否有保留?

要消除垃圾值,应在全局变量的实例化中初始化全局变量:

NSString *mySavePathString = nil;

您还需要确保显式保留(和释放)分配给全局变量的所有对象。(您的示例中是否有任何保留?

您的
[[NSFileManager defaultManager]fileExistsAtPath:savePath]
将返回
,因为存在
保存路径
,但该文件不存在,因为您尚未在中创建它

+(void)initialize
~~~~~~~~~~~~~~~~~~~~~编辑~~~~~~~~~~~~~~~~~~~~~~~~

使用
extern NSString*savePath
在您的GameInfo.h或.m中

您的
[[NSFileManager defaultManager]fileExistsAtPath:savePath]
将返回
,因为存在
保存路径
,但该文件不存在,因为您尚未在中创建它

+(void)initialize
~~~~~~~~~~~~~~~~~~~~~编辑~~~~~~~~~~~~~~~~~~~~~~~~

使用
extern NSString*savePath
在您的GameInfo.h或.m中

我在其他地方创建了它,当我启动新游戏时,我使用[GameInfo saveGame]方法,它看起来像+(void)save{[NSKeyedArchiver archiveRootObject:game toFile:savePath];}已编辑,您如何在GameInfo中使用savePath?您是否在其中声明了它?如果是,则如何声明?我导入了Blobals.h,在其中声明了extern NSString*savePath,所以我认为这就足够了。是吗?是的,是。。。另外,请尝试此注释所有来自Globals的外部对象。hI在其他位置创建了它。我在启动新游戏时使用[GameInfo saveGame]方法,该方法看起来像+(void)save{[NSKeyedArchiver archiveRootObject:game toFile:savePath];}已编辑,您如何在GameInfo中使用savePath?您是否在其中声明了它?如果是,则如何声明?我导入了Blobals.h,在其中声明了extern NSString*savePath,所以我认为这就足够了。是吗?是的,是。。。另外,请尝试一下Globals的所有外部人员的评论。抱歉,我不太明白你的问题。你见过我需要像savePath=[[documentsUrl URLByAppendingPathComponent:@“save.plist”]path]retain那样保留savePath吗;对这将阻止自动释放的对象被释放,从而可能被重用和丢弃。对不起,我不完全理解你的问题。你见过我需要像savePath=[[documentsUrl URLByAppendingPathComponent:@“save.plist”]path]retain那样保留savePath吗;对这将防止自动释放的对象被释放,从而可能被重用和丢弃。