我有一個名爲「CardSet」的類,其中包含一個用於容納「卡片」的NSMutableArray * cardSet,我將其擴展爲製作「DeckCards」。我想要「CardSet」有一個名爲「(void)addCard:(Card *)」(以及類似的方法「removeCard」)的方法。我想要「addCard」,以便如何訪問並設置cardSet。更好的是,我想使用「addCard」方法初始化cardSet。類文件 「CardSet.h」 記載:Objective-C ::使用方法更改對象
#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
這編譯就好了。我想用它的「addCard」方法初始化一個「DeckCards」實例52次。當我在DeckCards setter方法中調用addCard 52次並詢問其「cardSet」的大小時,我返回0.
這似乎是一個範圍或特權問題? 「addCard」方法是否具有setter特權?必須使用setter參數與返回和相應的成員類型相同?
[我可以通過在「DeckCard」之外創建一個NSMutableArray對象「deck_cards_temp」來解決上述問題,向其中添加52張卡片,並通過setter繼承「DeckCards」 CardSet」。這是不是很滿意!]
你有什麼建議?非常感謝您的幫助和耐心。
你或許應該還顯示'DeckCards'源。 – 2010-03-01 01:53:54
請注意,您可以通過縮進4個空格或單擊* code *按鈕來創建代碼塊。 – 2010-03-01 01:57:05
您還應該將這些訪問器方法重命名爲符合KVC。有關完整列表,請參閱http://developer.apple.com/documentation/Cocoa/Conceptual/ModelObjects/Articles/moAccessorMethods.html;兩個你應該改變'getCardSet'(應該只是'cardSet')和'getCard:'(應該是'objectInCardSetAtIndex:')。如果有任何事情(包括未來某天)會觀察這個'cardSet'屬性,這將爲這些訪問器啓用自動KVO通知。 – 2010-03-01 02:04:43