【问题标题】:Objective-c extern variables changesObjective-c 外部变量的变化
【发布时间】: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


    【解决方案1】:

    您的[[NSFileManager defaultManager] fileExistsAtPath: savePath]; 将返回NO,因为savePath 退出但不存在该文件,因为您尚未在其中创建它

    +(void)initialize
    

    ~~~~~~~~~~~~~~~~~已编辑~~~~~~~~~~~~~~~~~~~~
    在 GameInfo.h 或 .m 中使用 extern NSString *savePath;

    【讨论】:

    • 我在其他地方创建了它,当我开始新游戏时使用 [GameInfo saveGame] 方法,女巫看起来像 +(void)save { [NSKeyedArchiver archiveRootObject:game toFile: savePath]; }
    • 已编辑,你是如何在 GameInfo 中使用 savePath 的,如果是,那么如何声明?
    • 我在声明 extern NSString *savePath 的地方导入了 Blobals.h,所以我认为这就足够了。不是吗?
    • 是的,它是......也试试这个评论所有来自 Globals.h 的 externs
    【解决方案2】:

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

    NSString *mySavePathString = nil;
    

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

    【讨论】:

    • 对不起,我不太明白你的问题。你是不是我需要保留 savePath 像 savePath = [[[documentsUrl URLByAppendingPathComponent:@"save.plist"] path] retain];
    • 是的。这将防止自动释放的对象被释放,从而可能被重用和丢弃。
    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多