Изменения внешних переменных Objective-c - PullRequest
2 голосов
/ 08 февраля 2012

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

[GameInfo hasSave];

Это статический метод в классе GameInfo, который выглядит следующим образом:

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

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

/ Пользователи / Apple / Библиотека / Поддержка приложений / iPhone Simulator / 5.0 / Приложения / 472969F1-3760-4C74-8C8D-29681F47F4CB / Documents / save.plist

Но затем я выполняю IBAction при Touch Up внутри в том же виде, в то же время, которое выглядит как:

if ([GameInfo hasSave])
{
    [GameInfo load];
}

И когда я делаю шаг в методе hasSave, у меня появляется какое-то странное значение savePath:

ar.lproj

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

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

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

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

+(void)initialize

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

0 голосов
/ 08 февраля 2012

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

NSString *mySavePathString = nil;

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

...