• 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: NSBezierPath retain crash
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSBezierPath retain crash


  • Subject: Re: NSBezierPath retain crash
  • From: Shawn Erickson <email@hidden>
  • Date: Wed, 12 Nov 2003 12:47:02 -0800

On Nov 12, 2003, at 10:02 AM, Chad Harrison wrote:

I have an object which includes one instance of a NSBezierPath, but when I try to do anything with the path (like transform or stroke), it crashes - I though that since I am creating it with bezierPathWithRect: rect, it was autoreleased and I did not have to retain it. Even if I specifically retain and release it, it crashes. I'm missing something here.

You seem to misunderstand Cocoa memory management... read over the following

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/ index.html

@interface MyObject : NSObject {

NSBezierPath *path;
NSAffineTransform *transform;

NSRect rect;
int rectPointW, rectPointH;
}


- (void)setSize:(int)dimension
{
rect.size = NSMakeSize( dimension, dimension);
path = [NSBezierPath bezierPathWithRect: rect];

Path is being allocated by the bezierPathWithRect class method not directly by your code. So you are getting back path already autoreleased. So you need to retain path if you want it remain in existance. "autorelease" mean it will be get a release message sent to it automatically at some point in the future. This future release message may result in it being deallocated depending on retain count. In this case it will result in it being deallocated unless you retain it.

}


- (void)transform
{
transform = [[NSAffineTransform alloc] initWithTransform:[NSAffineTransform transform]];

Why are you doing the above? You can simply do the following...

transform = [NSAffineTransform transform];

Also why is "transform" a member variable when it is only used locally and not cleaned up correctly (you sent it a release message yet leave the variable pointing at the transform)? So..

NSAffineTransform* transform = [NSAffineTransform transform];

[transform translateXBy:rectPointW yBy:rectPointH];

[path transformUsingAffineTransform: transform]; <---- crashes here

[transform release];

If you switch to simply using [NSAffineTransform transform] then you do not need to call release since transform was given to you already autoreleased.

So one possible way to do things (not knowing what you are trying to do in the end)...

@interface MyObject : NSObject {
NSBezierPath *path;

NSRect rect;
int rectPointW, rectPointH;
}

- (void)dealloc
{
[path release];
}

- (void)setSize:(int)dimension
{
rect.size = NSMakeSize(dimension, dimension);

[path release];
path = [[NSBezierPath bezierPathWithRect: rect] retain];
}

//Ideally you would implement a setPath method that would do the correct retain/release instead of the above.

- (void)transform
{
NSAffineTransform* transform = [[NSAffineTransform transform] translateXBy:rectPointW yBy:rectPointH];
[path transformUsingAffineTransform: transform];
}
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.
  • Follow-Ups:
    • Re: NSBezierPath retain crash
      • From: Chad Harrison <email@hidden>
References: 
 >NSBezierPath retain crash (From: Chad Harrison <email@hidden>)

  • Prev by Date: Extending NSURLProtocol
  • Next by Date: Re: Recursive Downloads (FTP/CURL?)
  • Previous by thread: Re: NSBezierPath retain crash
  • Next by thread: Re: NSBezierPath retain crash
  • Index(es):
    • Date
    • Thread