• 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: Garbage collector vs variable lifetime
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Garbage collector vs variable lifetime


  • Subject: Re: Garbage collector vs variable lifetime
  • From: Ken Thomases <email@hidden>
  • Date: Fri, 6 Jun 2008 23:16:28 -0500

On Jun 6, 2008, at 10:48 PM, Antonio Nunes wrote:

On 7 Jun 2008, at 01:42, Bill Bumgarner wrote:

The easiest way to do this is to simply to use data once after the for() loop:

	NSData* data = <get it from somewhere>;
	const unsigned char* bytes = [data bytes];
	NSUInteger count = [data length];
	for (NSUInteger i = 0; i < count; i++)
		something = bytes [i];
	[data self];

Yup. I don't particularly like it either. Fortunately, it is an uncommon case -- most of the objects in the AppKit/Foundation "just work". This kind of a problem arises when something leverages the C in Objective-C.

Quincey Morris wrote:
A little inner voice insists on asking, though, how we know some future version of the compiler might not optimize '[data self]' upwards before the loop, if it decides that nothing inside the loop references anything non-local:

Why not explicitly turn off collection for the data pointer:

NSData* data = <get it from somewhere>;
[[NSGarbageCollector defaultCollector] disableCollectorForPointer:data];
const unsigned char* bytes = [data bytes];
NSUInteger count = [data length];
for (NSUInteger i = 0; i < count; i++)
something = bytes [i];
[[NSGarbageCollector defaultCollector] enableCollectorForPointer:data];


It's slightly longer, but straightforward and clear about it's purpose, and should be future proof.

And... we're back to retain/release.

The issue is, how can one know when this technique is necessary? The supposed rules of GC are, if it's in a stack variable, it's safe. The compiler here is doing something behind the programmer's back, which the programmer can't really predict, that's changing the rules.

Quoting the Garbage Collection Programming Guide: "The initial root set of objects is comprised of global variables, stack variables, and objects with external references. These objects are never considered as garbage"

For some values of "never".

Objective-C 2.0's garbage collection system is incompatible with any optimization which changes which variables are on the stack. More accurately, it's an error if compiler optimizations change what are considered root objects.

Regards,
Ken
_______________________________________________

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: Garbage collector vs variable lifetime
      • From: Antonio Nunes <email@hidden>
    • Re: Garbage collector vs variable lifetime
      • From: Bill Bumgarner <email@hidden>
References: 
 >Garbage collector vs variable lifetime (From: Quincey Morris <email@hidden>)
 >Re: Garbage collector vs variable lifetime (From: Bill Bumgarner <email@hidden>)
 >Re: Garbage collector vs variable lifetime (From: Ricky Sharp <email@hidden>)
 >Re: Garbage collector vs variable lifetime (From: Bill Bumgarner <email@hidden>)
 >Re: Garbage collector vs variable lifetime (From: Antonio Nunes <email@hidden>)

  • Prev by Date: Re: Garbage collector vs variable lifetime
  • Next by Date: Re: Garbage collector vs variable lifetime
  • Previous by thread: Re: Garbage collector vs variable lifetime
  • Next by thread: Re: Garbage collector vs variable lifetime
  • Index(es):
    • Date
    • Thread