No, it doesn't make a difference. In both cases the compiler will generate a 
"test and branch" to the method's epilogue. For the "=" case:

        if (self = [super init]) ...

is equivalent to:

        if ((self = [super init]) != nil) ...

is equivalent to:

        self = [super init];
        if (self) ...

is equivalent to:

        self = [super init];
        if (self != nil) …

They all:

• Call the superclass' -init method.
• Store the result in self.
• Test if self is not equal to nil/zero.
• Branch to method epilogue (or at least past {...}) if not.

The "==" case that has been mentioned just omits the second step because self 
isn't modified by calling [super init]. And the equivalent statements for the 
other case (! / ==) do the same thing except that the test step is the inverse.

In my opinion having a macro to replace the "self = [super init]" idiom saves 
you a couple of seconds of typing — once; it obfuscates behavior since you need 
to locate the macro to see what it does if you forget; and it is applicable 
only to subclasses where you're calling a superclass' -init method. It doesn't 
help for, e.g., -initWithCoder:, -initWithFrame:, etc., which then means you 
need to come up with a bunch of other macros to handle those cases or you're 
special-casing [super init].

Choosing to do an early return or not is up to you. Personally I prefer the "if 
(self != nil) {...}" case, even if the method is long so that I can see 
structure. To say more risks getting into a "religious" discussion that nobody 
wins. :)


> On May 30, 2015, at 3:20 PM, Alex Zavatone <z...@mac.com> wrote:
> 
> Actually, i was typing by habit and included == instead of = by mistake.
> 
> So, while you answered the question, you may have answered the wrong question.
> 
> The question is not for
> 
> if ( self == [super init])
> 
> It's 
> 
> if ( self =  [super init])
> 
> How does that change your answer?
> 
> On May 30, 2015, at 6:08 PM, Michael David Crawford wrote:
> 
>> While in principle machine code implementations of subroutines can
>> return from several different places, in practice they don't.  Rather
>> the compiler's code generator emits a branch instruction to the end of
>> the subroutine, there there is an "epilog".
>> 
>> There are many good reasons for returning from the middle in certain
>> specific cases; what if the only epilog you need is an "rts"?
>> Branching to the epilog could cause a cache miss.
>> 
>> I expect the compiler developers know all about this but don't
>> typically avail themselves of it because writing compilers is
>> difficult.
>> 
>> To be clear, the following source code:
>> 
>> - (id) init
>> {
>>  if ( self == [super init] ) return nil;
>> 
>>  // lots of code goes here
>> 
>>  return self;
>> }
>> 
>> ... is implemented as something like this, but in machine code:
>> 
>> - (id) init
>> {
>>  id result;
>>  if ( self == [super init] ){
>>    result = nil;
>>    goto epilog;
>>  }
>> 
>>  // lots of code goes here
>>  result = self;
>> 
>> epilog:
>>  return result;
>> }
>> Michael David Crawford, Consulting Software Engineer
>> mdcrawf...@gmail.com
>> http://www.warplife.com/mdc/
>> 
>>  Available for Software Development in the Portland, Oregon Metropolitan
>> Area.
>> 
>> 
>> On Fri, May 29, 2015 at 6:25 PM, Graham Cox <graham....@bigpond.com> wrote:
>>> 
>>>> On 30 May 2015, at 3:22 am, Alex Zavatone <z...@mac.com> wrote:
>>>> 
>>>> // We don't care if this gets long.
>>> 
>>> 
>>> My take is that you're rewriting a well-recognised idiom to solve a 
>>> non-existent problem.
>>> 
>>> The well-recognised idiom makes it easy to verify it's correct. Hiding a 
>>> different construct inside a macro obscures that, making it harder to 
>>> verify the code. It's not "wrong" exactly, just harder to see at a glance 
>>> that it's right.
>>> 
>>> The non-existent problem you're trying to solve is that the gap between a 
>>> pair of braces could get large. So what? Early returns can be another 
>>> source of bugs, so structural purists would tell you that you shouldn't do 
>>> that. Sometimes I think it's justified, but not usually worthwhile. Another 
>>> religious issue is whether matching braces should line up or not. 
>>> Personally I prefer that they do, at the cost of an extra line. Because you 
>>> aren't doing that, your long distance between braces is bothering you, 
>>> because you're losing track of where it started (I assume that's why it's 
>>> bothering you). If you line up the braces that is much less of an issue.
>>> 
>>> Source code is for humans, so it should be as readable as you can possibly 
>>> make it. Macros often hinder that. Unaligned braces hinder that. Multiple 
>>> statements per line hinder that.
>>> 
>>> Factoring code helps, so I'd suggest that's the better way to solve this. 
>>> (and it's also beneficial when it comes to making sure that -initWithCoder: 
>>> and other initializers that don't correctly follow the designated 
>>> initializer rule can get access to your common initialization. While this 
>>> is rarely a problem, I did notice that the recent change to encourage the 
>>> use of -initWithCoder: for unpacking NSViews from a nib breaks this 
>>> long-standing rule and so a common init method that both can call is a 
>>> simple workaround).
>>> 
>>> --Graham
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> 
>>> 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:
>>> https://lists.apple.com/mailman/options/cocoa-dev/mdcrawford%40gmail.com
>>> 
>>> This email sent to mdcrawf...@gmail.com
>> 
>> _______________________________________________
>> 
>> 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:
>> https://lists.apple.com/mailman/options/cocoa-dev/zav%40mac.com
>> 
>> This email sent to z...@mac.com
> 
> 
> _______________________________________________
> 
> 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:
> https://lists.apple.com/mailman/options/cocoa-dev/punster%40mac.com
> 
> This email sent to puns...@mac.com


_______________________________________________

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

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

Reply via email to