Objective-C, абстракция класса и доступ к этим переменным

StackOverflow https://stackoverflow.com/questions/1789832

Вопрос

У меня большой опыт разработки на 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

То же самое относится и к классу управления колодой.Надеюсь, это поможет найти вашу проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top