[BioCocoa-dev] Peptides...
Koen van der Drift
kvddrift at earthlink.net
Mon Mar 28 21:01:53 EST 2005
On Mar 28, 2005, at 12:22 PM, Charles PARNOT wrote:
> My issue is: all the problems come if you return a NSMutableArray
> instead of a NSArray in the symbolArray accessor. When you tell the
> user it gets an NSArray, the user expects that the array will never
> change. But if we return the ivar, the array may change and this will
> yield unexpected and difficult to debug results.
> for instance:
>
> BCSequence *seq=[BCSequence sequenceWithString:@"ATGT"];
> NSArray *symbols=[seq symbolArray];
> int n=[symbols count];
> [seq removeSymbolAtIndex:1];
> BCSymbol *last=[symbols objectAtIndex:n]; //UNEXPECTED EXCEPTION
>
> To make things clear, my 2-cents idea was that we could return the
> NSMutableArray ivar directly when performance is an issue. The
> headerdoc would clearly tell that the method returns a pointer to the
> ivar, and that it should only been used when performance is an issue
> (and it is actually already in the headerdoc, yes, Alex;-). Even if
> the user does not read the doc, at least it can't expect the returned
> array to be immutable and may be more careful anyway and if it behaves
> in a weird way, the fact that it is an NSMutableArray should be a
> clue.
>
> My opininon is the standard accessor 'symbolArray' should behave in a
> very standard way, because the average user will use it and it should
> be rock-solid. So when we say we return an immutable NSArray, it
> should really return an immutable NSArray.
>
>
The original issue for the Peptides example is not the difference
between immutable and mutable. Instead, the issue was that the accessor
symbolArray returned a copy of the symbolArray, instead of just a
pointer to that array, which is usual the case with accessors. Copying
the array highly slowed down the Peptides calculation, while it was not
necessary at all to create a copy. Therefore I suggested that we have
the standard accessor:
- (NSArray *)symbolArray
{
return symbolArray;
}
If the user really needs a copy of the array, there are at least two
possibilities: 1. we supply an additional accessor that returns a copy
(using [[symbolArray copy] autorelease]) 2. the user uses the standard
accessor, and creates the copy herself.
The mutable/immutable question is unrelated to this.
- Koen.
More information about the Biococoa-dev
mailing list