0

每个人。我的“英语”不是很好,但我希望你能理解我的问题。

假设我有这样的代码

-(id) init
{
    if ( self = [super init] )
    {
        deck = [[NSMutableArray alloc] initWithCapacity:52];
        Card *newCard = [[Card alloc] init];

        for ( int suit = 0; suit < 4; suit++ )
            for ( int rank = 0; rank < 13; rank++ )
            {
                newCard.suit = suit;
                newCard.rank = rank;
                [deck addObject:newCard];
            }
        [newCard release];
    }
    return self;
}

我觉得我在上述代码中有一个错误。我想在嵌套循环中创建 52 个不同的对象并将每个对象添加到数组中。但我怀疑我将有 52 个相同的对象,并且在数组中将有 52 个指向相同地址的指针,对吧?

如果我这样做会发生什么。

-(id) init
{
    if ( self = [super init] )
    {
        deck = [[NSMutableArray alloc] initWithCapacity:52];

        for ( int suit = 0; suit < 4; suit++ )
            for ( int rank = 0; rank < 13; rank++ )
            {
                Card *newCard = [[Card alloc] init]; // I guess every time newCard
                newCard.suit = suit;                 // created, it will point to 
                newCard.rank = rank;                 // another chunk of memory,
                [deck addObject:newCard];            // right?
                [newCard release] // Should I release newCard every time?
            }
    }
    return self;
}

那么我可以通过哪种方式创建 52 张不同的卡片呢?谢谢你。如果您需要更多解释,请询问我。

4

1 回答 1

0

第一个问题:您的第二个代码片段生成 52 个单独的对象,您将它们添加到数组中。正如您已经建议自己的那样,第一个片段只生成一个您添加到数组中的对象。因为它是一个对象,所以只有数组的所有成员都将携带相同的.suit和值.rank

Als 已经建议,当您 nslog 对象时,您至少会看到它们在内存中的地址。当地址相同时,它就是相同的对象。

第二个问题:是的,除非你使用 ARC,否则你应该释放它。addObject将自动保留每个添加的对象,并在从数组中删除时释放它。因此,稍后从数组中获取对象并打算进一步使用它时要小心。然后你可能不得不再次保留它。

替代您的 -correct- 代码,您可以使用以下方法自动释放对象:

        Card *newCard = [[[Card alloc] init] autorelease]; // I guess every time newCard
        newCard.suit = suit;                 // created, it will point to 
        newCard.rank = rank;                 // another chunk of memory,
        [deck addObject:newCard];            // right?
        //[newCard release]; // not required, autoreleased

(但是,发布声明后缺少分号。)

于 2013-03-27T09:59:54.987 回答