Re: More GC. Now with NSData
Re: More GC. Now with NSData
- Subject: Re: More GC. Now with NSData
- From: Alastair Houghton <email@hidden>
- Date: Mon, 26 Nov 2007 17:44:27 +0000
On 26 Nov 2007, at 17:20, Paul Sargent wrote:
I have an NSData that contains the complete set of data called
fullDataDump. I walk through this, partitioning it up into sub-
blocks with code something like this:
fullData = [fullDataDump bytes];
while (currentAddress < finalAddress) {
length = fullData[0];
NSData newRecord = [NSData dataWithBytesNoCopy:(void *) (fullData +
currentAddress) length:length freeWhenDone:NO]];
[rawDives addObject:newRecord];
}
i.e. creating an array of NSDatas that point into the same memory
space as the original.
My question is this, I've created these NSDatas without copying the
bytes, so have I put myself in a position where the garbage
collector could release the memory beneath them if the original
fullDataDump NSData was released?
Yes. The garbage collector doesn't support interior pointers. You
need to keep the original object around by holding on to a reference
to it until you're done with all of your data objects.
A better approach to the problem would be to use NSData's -
subdataWithRange: method; that will avoid having to do pointer
arithmetic and will also avoid entirely the problem with the garbage
collector.
Kind regards,
Alastair.
--
http://alastairs-place.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