2010-06-10 3 views
0

Эй, я новичок в Objective-C 2.0 и Xcode, так что простите, если мне не хватает чего-то элементарного здесь. В любом случае, я пытаюсь создать свой собственный класс UIViewController под названием GameView, чтобы отобразить новое представление. Для работы в игре мне нужно отслеживать NSArray, который я хочу загрузить из файла plist. Я создал метод loadGame, который должен загрузить правильный NSArray в переменную экземпляра. Однако оказывается, что после выполнения метода переменная экземпляра теряет отслеживание массива. Его легче, если я просто показать вам код ....Почему мой класс UIViewController не отслеживает переменную экземпляра 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 позже в вызове метода к другому, currentGame, как представляется, ноль. Я также знаю о проблемах управления памятью с помощью этого кода. Любая помощь будет оценена с этой проблемой.

+2

Откуда вы знаете, что «все работает отлично»? Вы переходите к отладчику и видите, что 'games' и' currentGame' правильно установлены на значения, отличные от nil? – Chuck

ответ

0

-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"]; 
+0

@Georg, как бы он получил значение 'nil'? Разве словарь вообще не может содержать этот объект? –

+0

@ Карл: Хороший момент, я прогнал часть «nil». Тем не менее, Чак, похоже, покрыл это. –

+0

Блестящий! это, по-видимому, проблема. В будущем, что бы вы назвали таким методом, как -objectForKey, который нужно сохранить, чтобы вы могли взять на себя ответственность? Большое спасибо за вашу помощь Георг. – wbarksdale

2

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

+0

Кажется, он работает, хотя Games.plist, по сути, находится в моей папке ресурсов. Спасибо за предложение. – wbarksdale

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