Re: Avoiding leaks with "initWithCGImage"
Re: Avoiding leaks with "initWithCGImage"
- Subject: Re: Avoiding leaks with "initWithCGImage"
- From: Rob Petrovec via Cocoa-dev <email@hidden>
- Date: Thu, 24 Aug 2023 08:39:47 -0600
To be clear, CGImageForProposedRect doesn’t have ‘Create’ in the name. So the
'Create Rule' doesn’t apply. But it is an easy thing to overlook.
—Rob
> On Aug 24, 2023, at 2:35 AM, JPH <email@hidden> wrote:
>
> Thanks to all of you
> The CFRelease(imageRef); was the problem and the CFRelease(subImageRef); is
> OK
> My fault was then to apply the old days « Create rule » , bypassing ARC !
> I was misled by Instruments/Leaks which reports a leak, which meant to me
> that I had to look for a missing release, not an over-release !!
> Very confusing !
>
> Thank again
> Happy Dog Days ( 41°C / 105,8°F here ! )
>
> JP
>
>
>
>> Le 24 août 2023 à 00:55, Rob Petrovec <email@hidden> a écrit :
>>
>> CGImageForProposedRect returns an autoreleased CGImageRef, so your
>> CFRelease(imageRef) is an overrelease and likely the cause of your problem.
>> The rest of the code looks fine, including the release of subImageRef (if it
>> was uncommented).
>>
>> —Rob
>>
>> Le 24 août 2023 à 01:11, Alex Zavatone <email@hidden> a écrit :
>>
>> Got a small sample we could play with? I would expect the crash on explicit
>> release as it would cause a double release.
>>
>> I tend to ignore I strums to with leaks and use the Memory Graph debugger
>> religiously.
>>
>> If you have a little sample showing this, I would be happy to test a bit
>> with it.
>>
>> Cheers,
>> Alex Zavatone
>
>
> Le 24 août 2023 à 07:44, Sandor Szatmari <email@hidden> a
> écrit :
>
> You mention ARC… aren’t you not supposed to explicitly release objects under
> ARC? Am I misunderstanding?
>
> Sandor
>
>>
>>> On Aug 23, 2023, at 4:47 PM, JPH via Cocoa-dev <email@hidden>
>>> wrote:
>>>
>>> Hello friends,
>>>
>>> The enclosed procedure is producing a NSImage from another NSImage, by
>>> cropping in a NSRect.
>>> The resulting sub-Image feeds an imageView in the APP Interface and the
>>> may change frequently, then being hopefully disposed by ARC
>>> The last line of the procedure :
>>> NSImage *subImage = [[NSImage alloc] initWithCGImage:subImageRef
>>> size:NSZeroSize];
>>> Generates a leak problem.
>>>
>>> it is quite unclear if i should release or not the subImageRef.
>>>
>>> If I release, the app crashes soon after.
>>> If I don’t release, Instrument/Leaks reports a leak of subImageRef after
>>> each call.
>>>
>>> Obviously, ARC never releases subImageRef which, as far as I
>>> understand, is owned by the subImage after the call.
>>>
>>> Digging the web , apple doc, and various AI, did not provide a solution to
>>> this dilemme.
>>>
>>> I would greatly appreciate some help on this
>>>
>>> Happy summer..
>>> JP
>>>
>>> C
>>> //=============================================================================
>>> + (NSImage *)getSubImageFromImage:(NSImage *)image atRect:(NSRect)rect
>>> //=============================================================================
>>> {
>>> // Convert the NSImage to a CGImageRef
>>> CGImageRef imageRef= nil, subImageRef= nil;
>>> imageRef = [image CGImageForProposedRect:NULL context:nil hints:nil];
>>> if (imageRef == nil ) { return nil; } // Failed to create CGImageRef
>>> // Get the subimage from the CGImageRef
>>> subImageRef = CGImageCreateWithImageInRect(imageRef, rect);
>>> CFRelease(imageRef);
>>> if(subImageRef == nil ) { return nil; } // Failed to create subImageRef
>>> // Convert the subimage CGImageRef to an NSImage
>>> NSImage *subImage = [[NSImage alloc] initWithCGImage:subImageRef
>>> size:NSZeroSize];
>>> // CFRelease(subImageRef); // it is quite unclear if i should release the
>>> subImageRef
>>> //If I release, the app crashes soon after.
>>> // If i dont release Instrument/Leaks report a leak at next call.
>>> // The subImage goes to a NSbutton in the interface, and will also soon be
>>> replaced by another one, producing a leak of subImageRef
>>>
>>> return subImage;
>>> }// getSubImageFromImage
>>> _______________________________________________
>>>
>>> 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
>>
>
_______________________________________________
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