Objective-C :: использование метода для изменения объекта - PullRequest
1 голос
/ 01 марта 2010

У меня есть класс "CardSet", содержащий NSMutableArray * cardSet для хранения "карточек", которые я расширяю для создания "DeckCards". Я хотел бы, чтобы "CardSet" имел метод с именем "(void) addCard: (Card *)" (и аналогично метод "removeCard"). Я хотел бы добавить "addCard" для некоторых, как иметь доступ и установить cardSet. Еще лучше, я бы хотел использовать метод «addCard» для инициализации cardSet. Файл класса "CardSet.h" читает:

 #import < Cocoa/Cocoa.h >

 #import < Card.h >

@interface CardSet : NSObject {

    NSMutableArray* cardSet;

}

-(id)init;

-(NSMutableArray*)getCardSet;

-(void)setCardSet:(NSMutableArray *)new_cardset;

-(Card*)getCard:(NSInteger) index;

**-(void)addCard:(Card*) new_card;**

-(void)removeCard:(Card*) old_card;

-(void)dealloc;

@property (readwrite, retain, getter=getCardSet, setter=setCardSet) NSMutableArray* cardSet;

@end

и файл метода читает:

 #import "CardSet.h"

@implementation CardSet

-(id)init{
    if( self = [super init] ){}   //will add initialisations here later
    return self;
}

-(NSMutableArray*)getCardSet{
    return cardSet;
}

-(void)setCardSet:(NSMutableArray *)new_cardSet{
    cardSet = new_cardSet;
}

-(Card*)getCard:(NSInteger)index{
    return [cardSet objectAtIndex:index];
}

**-(void)addCard:(Card *)new_card{
    [cardSet addObject:new_card];
}**

-(void)removeCard:(Card *)old_card{
    [cardSet removeObject:old_card];
}

-(void)dealloc{
    [cardSet release];
    [super dealloc];
}

@synthesize cardSet;

@end

Это компилируется просто отлично. Я хотел бы инициализировать экземпляр «DeckCards», используя его метод «addCard» 52 раза. Когда я вызываю addCard 52 раза в методе установки DeckCards и спрашиваю размер его "cardSet", мне возвращается 0.

Похоже, это проблема области действия или привилегий? Может ли метод addCard иметь какие-либо права доступа для установщика? Должен ли аргумент setter совпадать с возвращаемым и соответствующим типом члена?

[Я могу обойти вышесказанное, создав объект NSMutableArray "deck_cards_temp" вне "DeckCard", добавив к нему 52 карты и передав его для установки члена моего экземпляра "DeckCards" через установщик, унаследованный от "CardSet" ». Это не очень удовлетворительно!]

Что вы посоветуете? Заранее большое спасибо за вашу помощь и терпение.

Ответы [ 3 ]

3 голосов
/ 01 марта 2010

Вы никогда не создаете объект cardSet. Вы должны создать его в вашем -init методе:

-(id)init
{
    if( self = [super init] )
    {
        cardSet = [[NSMutableArray alloc] init];
    }
    return self;
}

Поскольку вы никогда не создаете массив, все вызовы -addCard: отправляются нулевому объекту.

Когда вы передаете массив в -setCardSet:, вы передаете инициализированный массив, так что массив больше не равен нулю и вызовы -addCard: работают нормально.

0 голосов
/ 01 марта 2010

Я бы сократил этот метод init:

- (id)init {
    if (self = [super init]) {
        // If we don't create the cardSet, how are we able to work with it!?
        self.cardSet = [NSMutableArray array];
    }
    return self;
}
0 голосов
/ 01 марта 2010

CardSet.h

#import <Cocoa/Cocoa.h>

// For know we just need to know there is a class named "Card" being used but implemented later
@class Card;

@interface CardSet : NSObject {
    NSMutableArray *cardSet;
}

// Here are the methods according to "correct" naming conventions
- (Card *)cardAtIndex:(NSInteger)index;
- (void)addCard:(Card *)card;
- (void)removeCard:(Card *)card;

// This will help us and forget about writing the setter/getter
@property (nonatomic, retain) NSMutableArray *cardSet;

@end

CardSet.m

#import "CardSet.h"
// Now we tell the compiler what "Card" is and what methods etc. it has
#import "Card.h"

@implementation CardSet

@synthesize cardSet;

- (id)init {
    if (self = [super init]) {
        // If we don't create the cardSet, how are we able to work with it!?
        NSMutableArray *anArray = [[NSMutableArray alloc] init];
        self.cardSet = anArray;
        [anArray release];
    }
    return self;
}

- (Card *)cardAtIndex:(NSInteger)index {
    return [cardSet objectAtIndex:index];
}

- (void)addCard:(Card *)card {
    [cardSet addObject:card];
}

- (void)removeCard:(Card *)card {
    [cardSet removeObject:card];
}

- (void)dealloc {
    [cardSet release];
    [super dealloc];
}

@end

Как уже отмечал Abizern : называть массив так же, как ваш класс, плохо.

...