Skip navigation.
 
mlRe: Accessor method styles
FROM : Sean Murphy
DATE : Tue Aug 29 18:10:05 2006

On Aug 29, 2006, at 10:53 AM, Andrew Merenbach wrote:

> Hi, all.  I've seen threads where this has been beaten to death, 
> but I am still left with major questions.


Be sure to check out the ADC documentation on accessor methods, which 
briefly mentions the advantages/tradeoffs of certain styles: <http://
developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/
Articles/mmAccessorMethods.html#//apple_ref/doc/uid/TP40003539>

The most significant tradeoff among the four methods you're examining 
is uncovered when this question is asked:  "what happens if setFoo is 
called with the same object that myFoo already points to?"  Three out 
of the four perform unnecessary work in the case of an identical 
object.  Please note that thread-safety also takes accessors a step 
further, in which case you'll need to use locks around instance 
variables.

> I have seen several kinds of accessor/mutator methods:
>
> - (void)setFoo:(AMFoo *)aFoo {
>     [aFoo retain];
>     [myFoo release];
>     myFoo = aFoo;
> }


If aFoo is the same object as myFoo, unnecessary retain/releases are 
performed.  It is important to retain, then release, in that order.

> - (void)setFoo:(AMFoo *)aFoo {
>     if (aFoo != myFoo) {
>         [myFoo release];
>         myFoo = [aFoo  retain];
>     }
> }


This is the only style listed here that avoids an unnecessary retain 
and release.  I stick with this convention.

> - (void)setFoo:(AMFoo *)aFoo {
>     id oldFoo = myFoo;
>     myFoo = [aFoo retain];
>     [oldFoo release];
> }


This one is fine, although no check for identical objects is 
performed.  If the two objects are identical, the retain and release 
is doing extra work again.

>
> - (void)setFoo:(AMFoo *)aFoo {
>     [myFoo autorelease];
>     myFoo = [aFoo retain];
> }


The autorelease is a more expensive operation, so there is a 
performance overhead with this style.  A  problem resulting from this 
method will not crash until after the current event loop, meaning the 
error will be harder to trace back to it's origin.

When you decide on a style, consider letting Accessorizer do the leg 
work for you: <http://www.kevincallahan.org/software/
accessorizer.html
>.  It can be customized to work with just about 
whatever accessor philosophy you adopt.

Speaking of Accessorizer, here's some documentation on the subject 
that Kevin recommends:
http://www.stepwise.com/Articles/Technical/2001-03-11.01.html
mmalcolm crawford
http://www.stepwise.com/Articles/Technical/2002-06-11.01.html
mmalcolm crawford
http://www.stepwise.com/Articles/Technical/MemoryManagement.html
manu iyengar
http://www.stepwise.com/Articles/Technical/HoldMe.html - don yacktman
http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/
index.html - Apple (developer Documentation)
http://homepage.mac.com/mmalc/CocoaExamples/controllers.html (cocoa 
bindings) - mmalcolm crawford
http://developer.apple.com/documentation/Cocoa/Conceptual/
CocoaBindings/index.html - Apple (developer documentation)
  http://theobroma.treehouseideas.com/document.page/18 - scott stevenson
http://developer.apple.com/documentation/Cocoa/Conceptual/
KeyValueCoding/index.html -Apple (developer documentation)
http://developer.apple.com/documentation/Cocoa/Conceptual/
KeyValueObserving/index.html - Apple (developer documentation)


- Sean

Note: Since I started typing this email, many great explanations have 
already been shared.  In the hope that my message can add to what has 
already been covered (and because I spent some time typing it up), 
I'll send it anyway.  Sorry it it repeats anything!

Related mailsAuthorDate
mlAccessor method styles Andrew Merenbach Aug 29, 16:53
mlRe: Accessor method styles Shawn Erickson Aug 29, 17:15
mlRe: Accessor method styles Ricky Sharp Aug 29, 17:18
mlRe: Accessor method styles Alberto Ricart Aug 29, 17:51
mlRe: Accessor method styles Andrew Merenbach Aug 29, 17:57
mlRe: Re: Accessor method styles Shawn Erickson Aug 29, 18:08
mlRe: Accessor method styles Sean Murphy Aug 29, 18:10