• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: self = [super init] debate.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: self = [super init] debate.


  • Subject: Re: self = [super init] debate.
  • From: Jens Alfke <email@hidden>
  • Date: Sun, 10 Feb 2008 11:45:00 -0800


On 10 Feb '08, at 9:18 AM, Scott Andrew wrote:

I see Will, and a few others, say no [super init] will initialize self in its code there is no reason to assign self.

No, you do [sometimes] need to assign self. 'self' is just a local variable (actually a parameter, one declared for you by the compiler.) The superclass's init method can't affect its value for you. However, in some cases the superclass method can decide to return a different object, and in that case unless you reassign self, you won't get the object the superclass initialized.


Why would an init method return a different object? Usually because it's part of a "class cluster" design pattern, where the public class is abstract, and behind the scenes some concrete subclasses are used. Most of the Cocoa collection classes work this way. When you call "- [[NSArray alloc] init] the result isn't an instance of NSArray, it's usually an NSCFArray, an internal class that manages the bridging to CoreFoundation's CFArray.

Another reason is to take advantage of variable-sized objects. You could have an array-like class that stores its array in itself, past the end of its regular instance variables. To do that, you have to call NSAllocateObject passing in the number of extra bytes to reserve. But you don't know that size until your -initWithSize: is called, after you've been allocated. So you make your -initWithSize call [self release], then NSAllocateObject with extra bytes, and assign that to self. The result is that -initWithSize returns a different instance than it was called on.

Any subclass that calls [super initWithSize] and doesn't reassign self to the result now has a 'self' variable that points to an obsolete dealloced object, and is now very likely to either crash immediately or (more likely) corrupt the heap and cause a later crash. Bad news.

-init methods that return a new object are rare. In most cases you don't need to add "self=" in front of the "[super init]" call. But in those few cases the consequences are grim, so it's better to train yourself to do it every time. It's only five more characters to type, and it should only compile into one or two extra machine instructions.

—Jens_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:
This email sent to email@hidden


References: 
 >self = [super init] debate. (From: Scott Andrew <email@hidden>)

  • Prev by Date: Re: Xcode 3.0, is it missing the Close Project menu item?
  • Next by Date: Re: Xcode 3.0, is it missing the Close Project menu item?
  • Previous by thread: Re: self = [super init] debate.
  • Next by thread: re: self = [super init] debate.
  • Index(es):
    • Date
    • Thread