• 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: stringByReplacingCharactersInRange leading to bus error
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: stringByReplacingCharactersInRange leading to bus error


  • Subject: Re: stringByReplacingCharactersInRange leading to bus error
  • From: Sherm Pendley <email@hidden>
  • Date: Wed, 18 Aug 2010 17:08:54 -0400

On Wed, Aug 18, 2010 at 4:22 PM, Kyle Sluder <email@hidden> wrote:
> On Wed, Aug 18, 2010 at 12:49 PM, Sherm Pendley <email@hidden> wrote:
>> The "[foo release]" is perfectly correct, but if
>> -stringByReplacingOccurrencesOfString:withString: is implemented with
>> a simple "return self;" then *both* foo and bar would be immediately
>> released. Implementing it as "return [[self retain] autorelease]"
>> prevents such problems.
>
> It doesn't violate the memory management guidelines to do so. The onus
> is technically on the caller to retain bar if he wants to use it later.

Here's the example you snipped:

  NSString *foo = [[NSString alloc] initWithString:@"foo"];
  NSString *bar = [foo stringByReplacingOccurrencesOfString:@"foo"
withString:@"foo"];
  [foo release];

The caller is doing nothing wrong here. It's finished using foo, and
released it. If the caller's only use of bar is within the scope of
the calling method, it's under no obligation to retain it. It's the
responsibility of -stringByReplacing... to return an object that
remains valid throughout the caller's scope, even if the original
string is released. Doing "return [[self retain] autorelease]"
fulfills that responsibility; "return self" does not.

> See: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmAccessorMethods.html

Indeed, on that very page, at
<http://developer.apple.com/mac/library/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmAccessorMethods.html#//apple_ref/doc/uid/TP40003539-SW6>,
it gives this example:

  - (NSString*) title {
      return [[title retain] autorelease];
  }

...

"Because the object returned from the get accessor is autoreleased in
the current scope, it remains valid if the property value is changed.
This makes the accessor more robust, but at the cost of additional
overhead."

Implementing -stringByReplacing... as "return [[self retain]
autorelease];" makes the same guarantee, that the object returned by
-stringByReplacing... will remain valid if the original string is
released.

sherm--

--
Cocoa programming in Perl:
http://camelbones.sourceforge.net
_______________________________________________

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: stringByReplacingCharactersInRange leading to bus error
      • From: Martin Wierschin <email@hidden>
    • Re: stringByReplacingCharactersInRange leading to bus error
      • From: Kyle Sluder <email@hidden>
References: 
 >stringByReplacingCharactersInRange leading to bus error (From: James Miller <email@hidden>)
 >Re: stringByReplacingCharactersInRange leading to bus error (From: "John C. Randolph" <email@hidden>)
 >Re: stringByReplacingCharactersInRange leading to bus error (From: Murat Konar <email@hidden>)
 >Re: stringByReplacingCharactersInRange leading to bus error (From: Sherm Pendley <email@hidden>)
 >Re: stringByReplacingCharactersInRange leading to bus error (From: Kyle Sluder <email@hidden>)
 >Re: stringByReplacingCharactersInRange leading to bus error (From: Sherm Pendley <email@hidden>)
 >Re: stringByReplacingCharactersInRange leading to bus error (From: Kyle Sluder <email@hidden>)

  • Prev by Date: Re: stringByReplacingCharactersInRange leading to bus error
  • Next by Date: Re: stringByReplacingCharactersInRange leading to bus error
  • Previous by thread: Re: stringByReplacingCharactersInRange leading to bus error
  • Next by thread: Re: stringByReplacingCharactersInRange leading to bus error
  • Index(es):
    • Date
    • Thread