• 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: Memory Management and objects creation via static methods...
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Memory Management and objects creation via static methods...


  • Subject: Re: Memory Management and objects creation via static methods...
  • From: "Sherm Pendley" <email@hidden>
  • Date: Tue, 25 Mar 2008 00:54:27 -0400

On Tue, Mar 25, 2008 at 12:19 AM, Samvel <email@hidden> wrote:

>
> Lots of classes define static methods that create objects for instance:
>
> Class NSString:
>        +(id) stringWithString: (NSString *) string;
>
> or Class NSArray:
>        +(id) arrayWithObjects: (id) firstObj, ...;
>
> I am really confused about next situation and memory management of
> objects created via those methods. Please, explain.


These methods don't have +alloc, +new, or -copy in their names, so it's your
responsibility to retain the returned object if you're going to need it
later.


> Imagine class with
>
>        NSString *string;
>
> instance variable. I create it and initiate with method above in:
>        -(id) init;
>
> of my class. Now, want to use this string in another method sometime
> later, say in:
>        -(void) plug;
>
> Should I retain string in init?
> e.g.:
>
>        -(id) init
>        {
>          // ...
>          string = [NSString stringWithString: @"hello"];
>          [string retain];
>          // ...
>        }
>
>        -(void) dealloc
>        {
>          // ...
>          [string dealloc];
>          // ...
>        }


Retaining "string" is required here - you created it with a method named
+stringWithString:, and you need to use it later.

But, I wouldn't assign directly to the variable, nor would I place the call
to -retain in your -init method. That's fragile - think about what happens
if you want to assign a new  value to string from elsewhere in your code.
You'd have to remember how your -init method first created it, release the
old value, and also remember to retain the new value, because -dealloc will
eventually release it. That breaks encapsulation; why should you have to be
thinking about what's inside your -init method, when you're writing a -foo
method? And you'd have to repeat this every time you assigned a new value,
leaving retains and releases scattered through your code - forget just one
of them, and you'll have a difficult bug to find.

Instead, I would create a setter method:

- (void)setString:(NSString *)value {
    if (string != value) {
        [string release];
        string = [value copy];
    }
}

And, in your -init, and anywhere else you need to assign a new value to
string, just do this: [self setString:[NSString
stringWithString:@"string"]].

Now, your retain and release calls are grouped in one place, making it very
simple to verify that they're balanced properly.

sherm--
_______________________________________________

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: 
 >Memory Management and objects creation via static methods... (From: Samvel <email@hidden>)

  • Prev by Date: Re: Memory Management and objects creation via static methods...
  • Next by Date: Re: Memory Management and objects creation via static methods...
  • Previous by thread: Re: Memory Management and objects creation via static methods...
  • Next by thread: Where is it better to register with NSNotificationCenter in class?
  • Index(es):
    • Date
    • Thread