On Thu, Apr 8, 2010 at 1:21 PM, Patrick M. Rutkowski <rutsk...@gmail.com> wrote:
> Agreed, but there's always the danger the +array method, which might
> actually be implemented in NSArray.m, will not properly initialize the
> more specific NSMutableArray object.
>
> Of course, in this specific case that's the case, but it might be the
> case with other class hierarchies.
>
> But, nonetheless I'm troubled that nobody in this thread has
> acknowledged that yet :-o

Take a look at the declaration for this method:

+ (id)array;

This is subtle... but it actually tells you everything you need to
know for this question.

The key is the "id" return type. Although at the language level this
just means that it returns some kind of object, it has a deeper
meaning when it comes to Cocoa conventions. More specifically, an "id"
type on a factory method like this means that the method will return
an instance of the class that the message is sent to, even if it's a
subclass. (It could return an instance of a subclass of that class,
but that's perfectly legal.) The "id' means that subclasses will work
correctly, and that the implementation uses [self alloc].

Virtually all factory methods are declared like this, and thus that's
how they work.

As a counterexample, look at +[NSParagraphStyle defaultParagraphStyle]:

+ (NSParagraphStyle *)defaultParagraphStyle;

It's not declared to return 'id'. This means that
[NSMutableParagraphStyle defaultParagraphStyle] is *not* guaranteed to
return an instance of NSMutableParagraphStyle. It could, but you
shouldn't count on it. You have to assume that the object you get is
always a straight NSParagraphStyle, and code accordingly. (In this
particular case, you'd make a mutable copy of the returned object,
then use that.)

As a bonus, this convention means that the compiler will yell at you
if you try to write code like:

NSMutableParagraphStyle *style = [NSMutableParagraphStyle
defaultParagraphStyle];

Of course you can't count on warnings to keep you safe all the time,
but it helps.

So check for the 'id' return value, and if it's there, you can code in
confidence.

Mike
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to