gpt4 book ai didi

objective-c - 我的对象范围有问题吗?

转载 作者:行者123 更新时间:2023-12-03 17:45:52 25 4
gpt4 key购买 nike

这是我正在编写的程序(我自己,而不是复制别人的程序,因此没有学习)作为 ObjectiveC 和 Cocoa 学习曲线的一部分。我想在 NSView 上绘制简单的形状(目前将其限制为椭圆形和矩形)。我的想法是,我将每个 NSBezierPath 记录到 NSMutableArray,这样我也可以调查/实现保存/加载、撤消/重做。我有一个 Canvas ,可以在上面绘图,还有两个用于选择工具的按钮。为了处理路径,我创建了另一个对象,它可以保存每个绘制对象的 NSBezierPath、颜色值和大小值。这就是我想存储在数组中的内容。我使用 mouseDown/Dragged/Up 来获取绘图路径的坐标。然而,这就是事情变得不稳定的地方。我可以实例化应该保存路径/颜色/等的对象。信息但是,当我尝试更改实例变量时,应用程序崩溃,调试器中没有有用的消息。我会尽量保持代码片段简短,但请告诉我是否需要包含更多内容。由于我尝试了很多方法来使其工作,代码也变得有点退化。

项目:基于 Cocoa 文档的应用程序
我有以下 .m/.h 文件

  • MyDocument:NSDocument - 由 XCode 生成
  • DrawnObject:NSObject - 处理绘制的对象,即路径、颜色、类型(椭圆形/矩形)和大小
  • Canvas:NSView - 好吧,显示绘图,处理鼠标和按钮

Canvas 还负责维护 NSMutableArrayDrawnObject对象。

DrawnObject.h看起来像这样:



<pre>#import <Foundation/Foundation.h>
//The drawn object must know what tool it was created with etc as this needs to be used for generating the drawing

@interface DrawnObject : NSObject {
NSBezierPath * aPath;
NSNumber * toolType;//0 for oval, 1 for rectangular etc....
float toolSize;
struct myCol{
float rd;
float grn;
float blu;
float alp;
} toolColor;
}

-(void)setAPath:(NSBezierPath *) path;
-(NSBezierPath *)aPath;
@property (readwrite,assign) NSNumber * toolType;
-(float)toolSize;
-(void)setToolSize:(float) size;
-(struct myCol *)toolColor;
-(void)setCurrentColor:(float)ref:(float)green:(float)blue:(float)alpha;

@end
</pre>

Canvas.h看起来像这样

#import #import "drawnObject.h"@interface Canvas : NSView {    NSMutableArray * myDrawing;    NSPoint downPoint;    NSPoint currentPoint;    NSBezierPath * viewPath;//to show the path as the user drags the mouse    NSNumber * currentToolType;    BOOL mouseUpFlag;//trying a diff way to make it work    BOOL mouseDrag;}-(IBAction)useOval:(id)sender;-(IBAction)useRect:(id)sender;-(IBAction)showTool:(id)sender;-(NSRect)currentRect;-(NSBezierPath *)createPath:(NSRect) aRect;-(void)setCurrentToolType:(NSNumber *) t;-(NSNumber *)currentToolType;@end

In the Canvas.m file there are several functions to deal with the mouse and NSView/XCode also dropped in <br/>-(id)initWithFrame:(NSRect)frame and -(void)drawRect:(NSRect)rect Originally I use mouseUp to try to insert the new DrawnObject into the array but that caused a crash. So, now I use two BOOL flags to see when the mouse was released (clunky but I'm trying....)in drawRect to insert into the array. I've included the method below and indicated where it causes the app to fail:

- (void)drawRect:(NSRect)rect { //This is called automatically    // Drawing code here.    //NSLog(@"Within drawRect tool type is %d", [self currentTool]);    NSRect bounds = [self bounds];    NSRect aRect = [self currentRect];    viewPath = [self createPath:aRect];//the createPath method uses the tool type to switch between oval and rect bezier curves    if(mouseUpFlag==YES && mouseDrag==YES){        mouseDrag=NO;        //Create a new drawnObject here         DrawnObject * anObject = [[DrawnObject alloc]init];//- WORKS FINE UP TO HERE        NSLog(@"CREATED NEW drawnObject");        [anObject setAPath:viewPath]; //- INSTANT APP DEATH!!!!        NSLog(@"Set a path in drawnObject");        [anObject setToolType:[[NSNumber alloc]initWithInt:5]];        NSLog(@"Set toolType in DrawnObject");        [anObject setToolType:currentToolType];        [myDrawing addObject:anObject];        NSLog(@"Added Object");    }       [[NSColor colorWithCalibratedRed:0.0 green:0.9 blue:0.0 alpha:0.5]set];    [NSBezierPath fillRect:bounds];    [[NSColor lightGrayColor]set];    [viewPath stroke]; //This is so the user can see where the drawing is being done    //Now, draw the paths in the array    [[NSColor blueColor]set];    for(DrawnObject * indexedObject in myDrawing){        [[indexedObject aPath] stroke];//This will do the actual drawing of ALL objects    }}

I guess this has something to do with object scope or something but I just can not figure it out. As I said, as I've tried things the code has sort of undergone an metamorphosis, sadly not for the better. Like those BOOLS etc.

HELP! Any clever people out there, point me in the right direction please!

ADDED THIS ON:


-(NSBezierPath *)createPath:(NSRect) aRect
{

NSBezierPath * tempPath;
//I need to know what tool

switch(0){ //temporary - this would use the toolType as a selector
case 0:
tempPath = [NSBezierPath bezierPathWithOvalInRect:aRect];
break;
case 1:
tempPath = [NSBezierPath bezierPathWithRect:aRect];
break;
default:
tempPath = [NSBezierPath bezierPathWithOvalInRect:aRect];
break;
}
return tempPath;
}

最佳答案

你说你的初始化方法是:

-(void)init {
[super init];
//set default color = black
toolColor.rd=1.0;
toolColor.grn=1.0;
toolColor.blu=1.0;
toolColor.alp=1.0;
//set default size
toolSize=0.8;
//set default toolType
toolType=0;
//oval
NSLog(@"Init %@",self);
}

绝对是错误的;在 Obj-C 指南中或通过阅读示例代码来了解如何创建 init 方法。它应该是这样的:

-(id)init {
if (self = [super init]) {
//set default color = black
toolColor.rd=1.0;
toolColor.grn=1.0;
toolColor.blu=1.0;
toolColor.alp=1.0;
//set default size
toolSize=0.8;
//set default toolType
toolType=0;
//oval
NSLog(@"Init %@",self);
}
return self;
}

通过不从 -init 返回任何内容,您就阻止了对象的创建。祝你好运! :-)

编辑:阿什利比我先一步......

关于objective-c - 我的对象范围有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com