Objective-c изменения внешних переменных

Пожалуйста, помогите, я застрял с глобальными переменными 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, который является моим RootViewController в методе viewDidLoad, я использую:

[GameInfo hasSave];

Это статический метод в классе GameInfo и выглядит так:

+(BOOL)hasSave
{
    return [[NSFileManager defaultManager] fileExistsAtPath: savePath];
}

И когда я его отслеживаю, savePath выглядит примерно так:

/ Пользователи / Apple / Библиотека / Поддержка приложений / 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

И мой метод конечно же возвращает мне НЕТ. Но это происходит не только с моим savePath, но и со всеми другими внешними переменными. Иногда они верны, а иногда нет. Думаю, может проблема в том, где я их использую, может я что-то забыл сделать. Помогите, пожалуйста.

P.S .: Извините за мой английский и большой вопрос.


person Luft-on    schedule 08.02.2012    source источник


Ответы (2)


ваш [[NSFileManager defaultManager] fileExistsAtPath: savePath]; вернет NO, поскольку savePath выходит, но файл не существует, поскольку вы не создавали его в

+(void)initialize

~~~~~~~~~~~~~~~~~ отредактировано ~~~~~~~~~~~~~~~~~~~~ - используйте extern NSString *savePath; в вашем GameInfo.h или. м

person Inder Kumar Rathore    schedule 08.02.2012
comment
Я создал его в другом месте. Я использую метод [GameInfo saveGame], когда начинаю новую игру, ведьма выглядит как + (void) save {[NSKeyedArchiver archiveRootObject: game toFile: savePath]; } - person Luft-on; 08.02.2012
comment
отредактировано, и как вы используете savePath в своем GameInfo, вы объявили его там, если да, то как? - person Inder Kumar Rathore; 08.02.2012
comment
Я импортировал Blobals.h, где объявляю extern NSString * savePath, поэтому думаю, что этого достаточно. Не так ли? - person Luft-on; 08.02.2012
comment
да, это так ... также попробуйте этот комментарий во всех внешних источниках Globals.h - person Inder Kumar Rathore; 08.02.2012

Чтобы исключить ненужные значения, вы должны инициализировать свои глобальные переменные в их экземплярах:

NSString *mySavePathString = nil;

Вам также необходимо убедиться, что любые объекты, назначенные глобальным переменным, явно сохраняются (и освобождаются). (Были ли остатки в вашем образце?)

person hotpaw2    schedule 08.02.2012
comment
Извините, я не совсем понимаю ваш вопрос. Вы заметили, что мне нужно сохранить savePath, например savePath = [[[documentsUrl URLByAppendingPathComponent: @ save.plist] путь] сохранить]; - person Luft-on; 08.02.2012
comment
да. Это предотвратит выпуск автоматически выпущенного объекта, который может быть повторно использован и удален. - person hotpaw2; 08.02.2012