2012-02-08 2 views
2

Помогите, я застрял с объективными глобальными переменными aka extern! я пишу свое первое приложение IOS, это игра, поэтому, чтобы сохранить свой прогресс, я написал некоторые глобальные переменные в Globals.h:Изменения переменных внешних переменных Objective-c

@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 

я сделать asured что метод инициализации выполняется хотя бы один раз, когда приложение запускается. В MainViewController это мой RootViewController в методе viewDidLoad я использую:

[GameInfo hasSave]; 

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

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

И когда я прослеживать НЕГО SavePath что-то вроде:

/пользователей/Apple/Library/Application Support/iPhone Simulator/5.0/Применения/472969F1-3760-4C74-8C8D-29681F47F4CB/Документы/save.plist

Но тогда я исполню IBAction Прикоснитесь внутрь в той же точки зрения, в то же время, которые выглядят как:

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

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

ar.lproj

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

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

ответ

0

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

+(void)initialize 

~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
extern NSString *savePath; в вашей GameInfo.h или .m

+0

Я создал его в другом месте, когда использую метод [GameInfo saveGame], когда я начинаю новую игру, ведьма выглядит как + (void) save { [архив NSKeyedArchiverRootObject: game toFile: savePath]; } –

+0

отредактирован и как вы используете savePath в своей GameInfo, вы объявили его там, если да, то как? –

+0

Я импортировал Blobals.h, где объявляю extern NSString * savePath, поэтому я думаю, этого достаточно. Не так ли? –

0

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

NSString *mySavePathString = nil; 

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

+0

Извините, я не совсем понимаю ваш вопрос. Можете ли вы мне сохранить savePath, как savePath = [[[documentUrl URLByAppendingPathComponent: @ "save.plist"] path] сохранить]; –

+0

Да. Это предотвратит освобождение автоматически отпущенного объекта, таким образом, его можно будет повторно использовать и уничтожить. – hotpaw2

Смежные вопросы