Re: Problem instantiating an array
Re: Problem instantiating an array
- Subject: Re: Problem instantiating an array
- From: Dave Carrigan <email@hidden>
- Date: Tue, 7 Dec 2010 10:49:01 -0800
On Dec 7, 2010, at 10:11 AM, Dennis wrote:
> On Dec 6, 2010, at 10:35 PM, Ken Thomases wrote:
>
>> If you step after the line "TileColumn *allColumns[boardDimension - 1]", nothing has happened, yet. That's just a declaration.
>
> But if for example I declare int test[16], the debugger shows the array "test" with 16 members. That's not happening in the case of my code with allColumns. It's displaying an array of -1 members.
There is a big difference in declaring an array with an integer literal and declaring one with an integer variable. In the former, the compiler knows at compile time what is the size of the array. This is not so in the case of the latter, which means that the debugger also doesn't know the size of the array. A smarter debugger might be able to know this, but gdb is not a smarter debugger. This is not a Cocoa thing; it's just part of the C language. In fact, variable-length arrays weren't even supported in C until relatively recently (C99?).
>> Finally, something to consider: there's nothing wrong with the technique you've used of populating a C array and then building an NSArray from that C array. However, you might consider creating an NSMutableArray that starts empty and then, during the for loop, each TileColumn is added to it. If you create the NSMutableArray with +arrayWithCapacity: or -initWithCapacity:, you'll even avoid reallocation as you add elements to the array.
>
> I experimented with doing that unsuccessfully.
You should keep experimenting; using Foundation arrays is usually preferable to using C arrays for most circumstances, unless speed is really important, and you won't know if that's the case until you start profiling.
Anyway, this should get you going:
gameColumns = [[NSMutableArray alloc] initWithCapacity:boardDimension];
for (.....) {
[gameColumns addObject:[[[TileColumn alloc] init] autorelease];
}
Note the autorelease of the tilecolumn. You need this because NSMutableArrays will claim ownership of their objects, so you need to relinquish your own ownership or else you'll have a memory leak.
--
Dave Carrigan
email@hidden
Seattle, WA, USA
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden