Re: newbie confused by obj-c syntax
Re: newbie confused by obj-c syntax
- Subject: Re: newbie confused by obj-c syntax
- From: Clark Cox <email@hidden>
- Date: Tue, 15 Mar 2005 07:30:10 -0500
On Mon, 14 Mar 2005 22:54:55 -1000, Daniel Child <email@hidden> wrote:
> Hi All,
>
> I am trying to use my own homegrown array of a class I created, called
> StrokeDescription. This class has two member variables: desc
> (description) and strokeType.
>
> Now I want to have a class that stores an array of these StrokeType
> objects. Somehow this didn't seem so hard in Java. I am getting hung up
> in Objective-C syntax and was hoping you could help out.
>
> Three questions:
> 1) Is it better to always use NSArray and NSMutableArray classes,
> rather than create your own classes of homegrown class objects.
It might not *always* be better, but I'd say that in this case, it
would be better and less error-prone for you.
> 2) How do you return an array (and not lose it).
In C, C++ and Objective-C, when you pass an array as a parameter or
return it from a function (or use it in most other expressions for
that matter), it decays into a pointer to the first element. So, when
you try, in two places, to return an array, you're really returning a
pointer to a local variable. That local variable ceases to exist once
the method returns, so you have an invalid pointer.
The common ways to get around this are:
1) Allocate the array dynamically via malloc(). This has the downside
that it is the caller's responsibility to free the memory (i.e. it
isn't ref-counted or garbage collected). Like so:
int *FunctionReturningArray()
{
/*Allocate enough memory to hold an array of 50 ints*/
int *myArray = malloc(50 * sizeof *myArray);
/*Populate the array*/
for(...)
{
myArray[i] = ...;
}
/*Caller is responsible for calling free() in the result, or else
you've got a memory leak*/
return myArray;
}
2) Have the caller pass in an array for you to populate. In this case,
you must be careful that the caller passes an array that is large
enough for your needs, so that you do not run off it's end. Like so:
bool FunctionPopulatingArray(int *myArray, size_t arraySize)
{
if(arraySize < whataeveSizeIReallyNeed)
{
/*Array is too small*/
return false;
}
/*Populate the array*/
for(...)
{
myArray[i] = ...;
}
return true;
}
3) In Objective-C, just use NSArray (as it is refcounted, you can just
return an autorelease-ed instance)
--
Clark S. Cox III
email@hidden
http://www.livejournal.com/users/clarkcox3/
http://homepage.mac.com/clarkcox3/
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden