Re: instance management in IB
Re: instance management in IB
- Subject: Re: instance management in IB
- From: Chris Carson <email@hidden>
- Date: Mon, 11 May 2009 22:35:05 -0700 (PDT)
Hi Jon,
Thanks! That did the trick -- I was way off.
Chris
----- Original Message ----
> From: Jonathan Hess <email@hidden>
> To: Chris Carson <email@hidden>
> Cc: email@hidden
> Sent: Tuesday, May 12, 2009 1:19:11 AM
> Subject: Re: instance management in IB
>
> Hey Chris -
>
> This line "pointPath = [NSBezierPath bezierPath];" in the init method creates an
> NSBezierPath instance that may (will!) be destroyed with the next autorelease
> pool flush. You should be creating your bezier path with "pointPath =
> [[NSBezierPath alloc] init];" and then add a "[pointPath release]" to your
> dealloc method.
>
> http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
>
> Good Luck -
> Jon Hess
>
> On May 11, 2009, at 6:29 PM, Chris Carson wrote:
>
> >
> > Hello,
> >
> > I've been scratching my head trying to get a basic delegate/data source
> Cocoa/AppKit program working and feel that I'm misunderstanding something basic
> (I've included the code is at the end).
> >
> > I set a breakpoint within the if statement in the init method of MyModel and
> see it called more than once. The second time the debugger throws a
> EXC_BAD_ACCESS. This message goes away if I comment out the two lines in
> stepAnimation that call the getBuffer and getLength methods and then modify the
> buffer. All this makes me think that somehow the instance of MyModel is being
> deallocated as soon as the data source message returns, but before the data is
> copied into the pointBuffer.
> >
> > I created an NSView and NSObject in Interface Builder, assigning the MyView
> subclass to the NSView object and MyModel to the NSObject object. Then I
> connected the dataSource outlet on MyView to th MyModel object.
> >
> > What am I missing? How can I get the data from MyModel to be viewable my
> MyView?
> >
> > Sidenote: Ultimately I'm trying to plot a real-time frequency spectrum. My
> plan is to pull in data over a CFMessagePort in the model and have the view
> access it view the data source.
> >
> > Help is much appreciated!
> >
> > Chris
> >
> > main.m
> > ----------
> >
> > int main(int argc, char *argv[]) {
> > // Launch Cocoa application
> > return NSApplicationMain(argc, (const char **) argv);
> > }
> >
> > MyView.m:
> > ----------
> > @implementation MyView
> >
> > - (id)initWithFrame:(NSRect)frame {
> > self = [super initWithFrame:frame];
> > if (self) {
> > pointPath = [NSBezierPathbezierPath];
> > pointBuffer = malloc (sizeof(NSPoint) * 100);
> > [NSTimerscheduledTimerWithTimeInterval:0.1
> > target:self
> > selector:@selector(stepAnimation:)
> > userInfo:nil
> > repeats:YES];
> > }
> > return self;
> > }
> >
> > - (void)drawRect:(NSRect)rect {
> > [pointPath removeAllPoints];
> > [pointPathappendBezierPathWithPoints:(NSPointArray)pointBuffercount:100];
> > [pointPathstroke];
> > }
> >
> > - (void)setDataSource:(id)inDataSource {
> > dataSource = inDataSource;
> > }
> >
> > - (id)dataSource {
> > returndataSource;
> > }
> >
> > - (void)stepAnimation:(NSTimer *)timer {
> > float*inBuffer;
> > int i, length;
> >
> >
> > // Fetch buffer pointer
> > inBuffer = [[self dataSource] getBuffer:self];
> > length = [[self dataSource] getLength:self];
> >
> > // Copy to point buffer
> > for (i = 0; i < length; i++) {
> > pointBuffer[i].y = inBuffer[i];
> > pointBuffer[i].x = i;
> > }
> >
> > // Mark display for painting
> > [selfsetNeedsDisplay:YES];
> > }
> >
> > - (void)dealloc {
> > free(pointBuffer);
> > [super dealloc];
> > }
> >
> > @end
> >
> > MyView.h
> > ----------
> > @interface MyView : NSView {
> > IBOutletid dataSource;
> > NSBezierPath *pointPath;
> > NSPoint *pointBuffer;
> > }
> >
> > - (void)setDataSource:(id)inDataSource;
> > - (id)dataSource;
> > - (void)stepAnimation:(NSTimer *)timer;
> >
> > @end
> >
> > @interface NSObject(MyViewDataSource)
> >
> > - (float *)getBuffer:(MyView *)view;
> > - (int)getLength:(MyView *)view;
> >
> > @end
> >
> > MyModel.m
> > ----------
> > @implementationMyModel
> >
> > - (id)init {
> > self= [superinit];
> > if (self) {
> > buffer = malloc (sizeof(float) * 100);
> > length = 100;
> > }
> > return self;
> > }
> >
> > - (float *)getBuffer:(GraphView *)view {
> > returnbuffer;
> > }
> >
> > - (int)getLength:(GraphView *)view {
> > returnlength;
> > }
> >
> > - (void)dealloc {
> > free (buffer);
> > [super dealloc];
> > }
> >
> > @end
> >
> > MyModel.h
> > ----------
> > @interface MyModel : NSObject {
> > float *buffer;
> > int length;
> > }
> >
> > - (float *)getBuffer:(GraphView *)view;
> > - (int)getLength:(GraphView *)view;
> >
> > @end
> >
> >
> >
> >
> > _______________________________________________
> >
> > 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