在循环中声明指针

时间:2013-03-27 09:41:53

标签: objective-c

大家。我的“恩惠”并不是很好,但我希望你能理解我的问题。

假设我有一个像这样的代码

-(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种不同的卡片? 谢谢。如果您需要更多解释,请问我。

1 个答案:

答案 0 :(得分:0)

第一个问题:您的第二个代码片段会生成52个单独的对象,您可以将这些对象添加到数组中。 正如您自己建议的那样,第一个sniplet只生成一个添加到数组中的对象。由于它是一个对象,因此只有数组的所有成员都具有.suit.rank的相同值。

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

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

您可以使用以下代码替换您的代码:

        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

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