Objective-C::使用方法来改变对象

标签 objective-c cocoa properties setter accessor

我有一个名为“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

这编译得很好。我想使用“addCard”方法初始化“DeckCards”实例 52 次。当我在 DeckCards setter 方法中调用 addCard 52 次,并询问其“cardSet”的大小时,我返回 0。

这似乎是范围或权限问题? “addCard”方法可以有任何设置权限吗? setter 参数必须与返回值和相应的成员类型相同吗?

[我可以通过在“DeckCard”外部创建一个 NSMutableArray 对象“deck_cards_temp”来解决上述问题,向其中添加 52 张卡片,然后通过从“CardSet”继承的 setter 将其传递给我的“DeckCards”实例的成员”。这不太令人满意!]

你有什么建议?非常感谢您的帮助和耐心。

最佳答案

您实际上从未创建cardSet对象。您应该在 -init 方法中创建它:

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

因为您从未实际创建数组,所以对 -addCard: 的所有调用都将发送到 nil 对象。

当您将数组传递给 -setCardSet: 时,您将传递一个已初始化的数组,因此该数组不再为零,并且 -addCard: 调用可以正常工作.

关于Objective-C::使用方法来改变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353470/

相关文章:

swift - 以编程方式单击 NSButton 时如何关闭 NSViewController

javascript - 获取多级javascript对象属性的简单方法

ios - 为什么从完成 block 中推送 View Controller 时会出现约束错误?

macos - 禁用 "Share"子菜单

iphone - UITextView 在 'Done' 上退出第一响应者

objective-c - Cocoa Objective-C 初始化异常

javascript - 为了获取对象属性标识符而不是属性值?

object - 如何从数组向 PowerShell 对象添加属性

objective-c - 超时在 NSAppleScript 中没有效果

objective-c - Xcode 编译器宏 TARGET_IPHONE_SIMULATOR