大家。我的“恩惠”并不是很好,但我希望你能理解我的问题。
假设我有一个像这样的代码
-(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种不同的卡片? 谢谢。如果您需要更多解释,请问我。
答案 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
(但是,在发布声明之后缺少分号。)