• 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: Simple instance [[alloc] init] question.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Simple instance [[alloc] init] question.


  • Subject: Re: Simple instance [[alloc] init] question.
  • From: mmalc Crawford <email@hidden>
  • Date: Mon, 30 Aug 2010 20:25:38 -0700

On Aug 30, 2010, at 6:37 PM, Dave Geering wrote:

>> // 1)
>> self.serialIDs = [[IRMSerialDetailsDO alloc] init];
>
> The alloc method allocates an instance with a retain count of 1, and
> assigning it to the serialIDs property bumps it up to 2. In your
> dealloc method, you will [hopefully] send it a release message which
> puts it back at 1, but this means the object still survives (i.e. it
> is not deallocated).
>
>> // 2)
>> IRMSerialDetailsDO *mySerialIDDO = [[IRMSerialDetailsDO alloc] init];
>> self.serialIDDO = mySerialIDDO;
>> [mySerialIDDO release];
>
> Here, the alloc creates the instance with a retain count 1, assigning
> it to the property bumps it up to 2, and the release right afterwards
> puts it back down to 1. In your dealloc method, you will sent it
> another release message which puts it at 0, and therefore the instance
> is deallocated.
>


This is at best misleading, and illustrates why people are typically discouraged from reformulating the memory management rules.

First, from the original post:
> <header file>.h

> @property(nonatomic, release) IRMSerialDetailsDO *serialIDs;
> ...
> <body>.m
> @synthesize mySerialIDDO
>
This is just wrong.
There is no 'release' keyword for a property declaration, and the name of the property in the declaration does not match that in the synthesize statement.

Assuming that the intent was:

<header file>.h
@property(nonatomic, retain) IRMSerialDetailsDO * mySerialIDDO;
...
<body>.m
@synthesize mySerialIDDO


then if you set the mySerialIDDO variable using the corresponding accessor method, you end up owning the object. It is your responsibility to subsequently relinquish ownership in dealloc. Whether or not this results in the object being deallocated depends on what other objects may have claimed ownership in the interim, and is of no interest to you.

As others have noted, adhering to the memory management rules (<http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html>), by convention this results in a memory leak:

self.serialIDs = [[IRMSerialDetailsDO alloc] init];

To address the issue of the second pattern:

> IRMSerialDetailsDO *mySerialIDDO = [[IRMSerialDetailsDO alloc] init];
> self.serialIDDO = mySerialIDDO;
> [mySerialIDDO release];
>

This is explained in the Your First iOS Application tutorial:
	<http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhone101/Articles/03_AddingViewController.html#//apple_ref/doc/uid/TP40007514-CH5-SW1>

It is, and remains, best practice to avoid using autorelease where possible. Autoreleasing objects means they may end up living longer than is strictly necessary, and this adds to your application's memory footprint. Not something you want on a deive with a constrained amount of memory.

mmalc










_______________________________________________

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

  • Follow-Ups:
    • Re: Simple instance [[alloc] init] question.
      • From: Dave Geering <email@hidden>
References: 
 >Simple instance [[alloc] init] question. (From: "Frederick C. Lee" <email@hidden>)
 >Re: Simple instance [[alloc] init] question. (From: Dave Geering <email@hidden>)

  • Prev by Date: Re: Simple instance [[alloc] init] question.
  • Next by Date: Re: Simple instance [[alloc] init] question.
  • Previous by thread: Re: Simple instance [[alloc] init] question.
  • Next by thread: Re: Simple instance [[alloc] init] question.
  • Index(es):
    • Date
    • Thread