Hi Jon,

Thanks! That did the trick -- I was way off.

Chris


----- Original Message ----
> From: Jonathan Hess <jh...@apple.com>
> To: Chris Carson <cucar...@yahoo.com>
> Cc: cocoa-dev@lists.apple.com
> 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 (Cocoa-dev@lists.apple.com)
> > 
> > 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:
> > http://lists.apple.com/mailman/options/cocoa-dev/jhess%40apple.com
> > 
> > This email sent to jh...@apple.com



      
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to