FROM : Gregory Weston
DATE : Sat Feb 16 22:16:13 2008
On Feb 16, 2008, at 12:11 PM, Bill Bumgarner wrote:
> On Feb 16, 2008, at 4:56 AM, Gregory Weston wrote:
>> Without that guarantee, there's a different between saying "this
>> statement accurately describes all current implementations" and
>> "this statement is correct." It is not correct in general to say
>> that "[Foo new] is exactly equivalent to [[Foo alloc] init]."
>> Those are the kind of assumptions that burn you after you've
>> forgotten you made them in the first place.
>
> In general, I agree. In this particular case, I'm not concerned.
> If Apple were to change the implementation of +new to *not* do
> +alloc followed by -init, many many bits of code would break.
> Binary compatibility between release of Mac OS X is critical and,
> thus, this particular behavior cannot change.
I'm afraid I don't understand that assertion at all. What does this
have to do with binary compatibility? Why did it *not* break
compatibility in the move from 10.4 (in which new does not invoke
alloc by default) to 10.5 (in which it does)?
> Reading the docs, it explicitly states:
>
> ...
> This method is a combination of alloc and init. Like alloc, it
> initializes the isa instance variable of the new object so it
> points to the class data structure. It then invokes the init method
> to complete the initialization process.
> ...
>
> From there, the documentation entirely discusses implementing
> +new... as a cover for various -initWith... style initializers.
>
> Thus, the bare behavior of +new is quite thoroughly well defined as
> a combination of +alloc and -init (in the docs, the the two method
> names are links to the documentation of said methods).
It's well defined as being functionally equivalent by default to
alloc and init. It is even defined, as I had already noted, as
invoking init specifically. Given that explicitness, I would argue
that it's likely meaningful that the documentation does *not*
explicitly indicate that it invokes alloc. In fact the implication of
"Like alloc, ..." is very strongly that it's only guaranteed to be an
equivalent, not a wrapper. And since any developer who wants can
override alloc and new at any time they like, even though Apple
*does* implement new to invoke alloc by default it cannot be reliably
said to do so.
DATE : Sat Feb 16 22:16:13 2008
On Feb 16, 2008, at 12:11 PM, Bill Bumgarner wrote:
> On Feb 16, 2008, at 4:56 AM, Gregory Weston wrote:
>> Without that guarantee, there's a different between saying "this
>> statement accurately describes all current implementations" and
>> "this statement is correct." It is not correct in general to say
>> that "[Foo new] is exactly equivalent to [[Foo alloc] init]."
>> Those are the kind of assumptions that burn you after you've
>> forgotten you made them in the first place.
>
> In general, I agree. In this particular case, I'm not concerned.
> If Apple were to change the implementation of +new to *not* do
> +alloc followed by -init, many many bits of code would break.
> Binary compatibility between release of Mac OS X is critical and,
> thus, this particular behavior cannot change.
I'm afraid I don't understand that assertion at all. What does this
have to do with binary compatibility? Why did it *not* break
compatibility in the move from 10.4 (in which new does not invoke
alloc by default) to 10.5 (in which it does)?
> Reading the docs, it explicitly states:
>
> ...
> This method is a combination of alloc and init. Like alloc, it
> initializes the isa instance variable of the new object so it
> points to the class data structure. It then invokes the init method
> to complete the initialization process.
> ...
>
> From there, the documentation entirely discusses implementing
> +new... as a cover for various -initWith... style initializers.
>
> Thus, the bare behavior of +new is quite thoroughly well defined as
> a combination of +alloc and -init (in the docs, the the two method
> names are links to the documentation of said methods).
It's well defined as being functionally equivalent by default to
alloc and init. It is even defined, as I had already noted, as
invoking init specifically. Given that explicitness, I would argue
that it's likely meaningful that the documentation does *not*
explicitly indicate that it invokes alloc. In fact the implication of
"Like alloc, ..." is very strongly that it's only guaranteed to be an
equivalent, not a wrapper. And since any developer who wants can
override alloc and new at any time they like, even though Apple
*does* implement new to invoke alloc by default it cannot be reliably
said to do so.






Cocoa mail archive

