Почему мой класс UIViewController не отслеживает переменную экземпляра NSArray - PullRequest
0 голосов
/ 10 июня 2010

Привет, я новичок в Objective-C 2.0 и Xcode, так что прости меня, если я упустил что-то элементарное здесь.В любом случае, я пытаюсь создать свой собственный класс UIViewController под названием GameView для отображения нового представления.Для работы игры мне нужно отслеживать NSArray, который я хочу загрузить из файла plist.Я сделал метод loadGame, который я хочу загрузить правильный NSArray в переменную экземпляра.Однако, похоже, что после выполнения метода переменная экземпляра теряет дорожку массива.Проще, если я просто покажу вам код ....

    @interface GameView : UIViewController {
        IBOutlet UIView *view 
        IBOutlet UILabel *label;
        NSArray *currentGame;
    }

    -(IBOutlet)next;
    -(void)loadDefault;
...
@implementation GameView
- (IBOutlet)next{
   int numElements = [currentGame count];
   int r = rand() % numElements;
   NSString *myString = [currentGame objectAtIndex:(NSUInteger)r];
   [label setText: myString];
}
- (void)loadDefault {
    NSDictionary *games;
    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSString *finalPath = [path stringByAppendingPathComponent:@"Games.plist"];
    games = [NSDictionary dictionaryWithContentsOfFile:finalPath];
    currentGame = [games objectForKey:@"Default"];
}

, когда вызывается loadDefault, все работает отлично, но когда я пытаюсь использовать currentGame NSArray позже при вызове метода next, появляется currentGameбыть ноль.Я также знаю о проблемах управления памятью с этим кодом.Любая помощь будет оценена с этой проблемой.

Ответы [ 2 ]

2 голосов
/ 10 июня 2010

Я был бы удивлен, если бы этот код работал.Games.plist действительно на верхнем уровне вашего пакета?Это не находится в папке ресурсов вашего пакета или в Документах или Поддержке приложений?Бьюсь об заклад, если вы отладите метод, вы увидите, что вы не правильно его нашли.

0 голосов
/ 10 июня 2010

-objectForKey: не возвращает принадлежащий вам объект, вам необходимо явным образом вступить во владение, сохранив:

currentGame = [[games objectForKey:@"Default"] retain];

Или используя объявленные свойства:

@interface GameView ()
@property (readwrite, retain) NSArray *currentGame;
@end

@implementation GameView
@synthesize currentGame;
// ...
- (void)loadDefault {
    // ...
    self.currentGame = [games objectForKey:@"Default"];
...