Objective-C, абстракция класса и доступ к этим переменным
-
22-09-2019 - |
Вопрос
У меня большой опыт разработки на Java и c ++, поэтому классы и абстрагирование данных даются мне довольно легко.Я только недавно запустил objective C, и в основном я работал с глобальными файлами класса in, и все шло гладко.Я просто решил абстрагировать большую часть своего кода, пытаясь сделать его менее спагетти-кодом, и столкнулся с проблемой, которую не мог решить с субботы.
Набросок:
Я создаю игральную карточную игру.Недавно я абстрагировал данные карты в класс, содержащий 3 переменные;(int)i_cardValue, (int)i_cardSuit и (UIImage *)uii_cardImage.Я создаю открытку, позвонив
-(PlayingCard *)initWithValue:(int)i_initValue suit:(int)i_initSuit image:(UIIMage*)uii_initImage {
[self setCardValue:i_initValue];
[self setCardSuit:i_initSuit];
[self setCardImage:i_initImage];
return self;
}
Я также абстрагировал часть движка (в основном функции колоды, такие как перетасовка и управление колодой).Дека представляет собой изменяемый массив, и у меня есть функция init deck.
NSMutableArray *nsma_deck;
-(void)initDeck {
nsma_deck = [[NSMutableArray alloc] initWithCapacity:52];
}
Теперь, в моем контроллере просмотра, я вызываю initDeck, затем добавляю элементы в колоду с помощью такой строки, как
[pce_Engine initDeck];
[[pce_Engine nsma_deck] addObject:[[PlayingCard alloc] initWithValue:13 suit:2 image:[UIImage imageNamed:@"2C.png"]]];
pce_Engine - это переменная типа PlayingCardEngine.Я помещаю строки NSLog в initDeck, и они не отображаются в консоли, когда я запускаю свою программу.Они не вызываются, поэтому массив не распределяется, и, следовательно, я не могу добавить материал в массив?Я думал, что все сделал правильно, но либо я делаю это неправильно,либо я что-то упускаю, потому что добавление этого в представление не приводит к отображению.Используя NSLog, deck == nil, поэтому я предполагаю, что проблема в том, что я неправильно обращаюсь к deck и, следовательно, не добавляю значения и везде имею только пустые переменные : ( .Я пробовал просматривать множество руководств по objective c, но я даже не нашел ни одного, который бы абстрагировался настолько, насколько я собираюсь, поэтому я не смог найти свою проблему.
Кто-нибудь может указать мне правильное направление?
Решение
Прежде всего, я согласен с Эймантасом в том, что в вашем методе init отсутствует вызов [super init] (значение, которое вы должны возвращать, читайте о том, как выглядит обычный метод init).
Но что касается init_deck - каким методом в вашем контроллере просмотра у вас есть эти две строки?Я думаю, что это не вызывается больше на основе того, где находится вызывающий код, чем что-либо еще (хотя pce_Engine также может быть равен нулю при вызове этого кода, и в этом случае он вообще не будет работать).
Другие советы
Я предполагаю, что ваш класс card является подклассом NSObject
в этом случае вам следует реализовать назначенный инициализатор (init
) который вызывает [super init]
и выполняет общую настройку.И в вашем взаимодействии...метод, который вы должны вызвать [self init]
а затем выполняйте задание.
Вот хороший пост об инициализаторах cocoa / objective-c: http://mikeash.com/?page=pyblog/the-how-and-why-of-cocoa-initializers.html
То же самое относится и к классу управления колодой.Надеюсь, это поможет найти вашу проблему.