Objective c EXC_访问实例变量时出现坏访问内存问题

Objective c EXC_访问实例变量时出现坏访问内存问题,objective-c,Objective C,我在将前一段时间参与的一个Java项目移植到Objective-C代码时遇到问题-在代码的第一行,我得到了“程序接收信号:“EXC_BAD_ACCESS”: -(Point3D *) unit { NSLog(@"%@%@", "X: ", x); double length = [self length]; return [[Point3D alloc] initWithX:x/length andY:y/length andZ:z/length]; } 从这里呼叫: -(id)

我在将前一段时间参与的一个Java项目移植到Objective-C代码时遇到问题-在代码的第一行,我得到了“程序接收信号:“EXC_BAD_ACCESS”:

-(Point3D *) unit {
  NSLog(@"%@%@", "X: ", x);
  double length = [self length];
  return [[Point3D alloc] initWithX:x/length andY:y/length andZ:z/length];
}
从这里呼叫:

-(id) initWithStart:(Point3D *)start andDirection:(Point3D *)dir {

  if ( self = [super init] ) {

    NSLog(@"%@%@", @"Direction:", [dir toString]);

    printf("Trying to find unit length of direction...\n");
    NSLog(@"%@", [[dir unit] toString]);


    self.start = start;
    self.direction = [dir unit];
  }

  return self;
}
控制台输出为:

2011-12-09 17:20:14.021 RayTracerProject[16607:407] Direction:(0,0,20)
Trying to find unit length of direction...
Point3D的toString方法如下所示:

-(NSString *) toString {
  NSNumber *xstring = [NSNumber numberWithDouble:self.x];
  NSNumber *ystring = [NSNumber numberWithDouble:self.y];
  NSNumber *zstring = [NSNumber numberWithDouble:self.z];

  NSString * str = @"(";
  str = [str stringByAppendingString:[xstring stringValue]];
  str = [str stringByAppendingString:@","];
  str = [str stringByAppendingString:[ystring stringValue]];
  str = [str stringByAppendingString:@","];
  str = [str stringByAppendingString:[zstring stringValue]];
  str = [str stringByAppendingString:@")"];

  return str;
}
因此,从我所看到的,当我使用我的
[dir-toString]
调用检查值时,我的
(Point3D*)dir
是活动的。但是当我尝试调用
[dir unit]
时,似乎我不再拥有在对象中使用的变量,因此出现
EXC\u BAD\u ACCESS
错误


我做错了什么?我认为这与我管理(或不管理)内存使用的方式有关,但我不知道这是什么

方法“单位”中的NSLog应为:

NSLog(@"%@ %g", @"X:", x);
移动空间是可选的,但只是让它更清晰。关键问题是,您在
“X:
之前缺少
@
,您需要使用
%g
而不是
%@
,因为从另一个代码中,X是一个双精度对象,而不是一个NSObject。等效但更简单,因此更好的还有:

NSLog(@"X: %g", x);

苹果的文档提供了和,以及周围的文档解释了在构造NSString时使用格式说明符,如
%@
(引用目标C对象)和
%g
(引用64位浮点数)。

这里似乎是这样的:

NSLog(@“%@%@”,“X:”,X)

应该更像这样:

-(NSString *) toString {
  NSNumber *xstring = [NSNumber numberWithDouble:self.x];
  NSNumber *ystring = [NSNumber numberWithDouble:self.y];
  NSNumber *zstring = [NSNumber numberWithDouble:self.z];

  NSString * str = @"(";
  str = [str stringByAppendingString:[xstring stringValue]];
  str = [str stringByAppendingString:@","];
  str = [str stringByAppendingString:[ystring stringValue]];
  str = [str stringByAppendingString:@","];
  str = [str stringByAppendingString:[zstring stringValue]];
  str = [str stringByAppendingString:@")"];

  return str;
}
NSLog(@“%@%lf”,“X:”,self.X)

请注意此处的一些更改:

  • 从您的其他代码中,似乎有一个名为“x”的属性。self.x引用该属性。(您可能有也可能没有名为“x”的实例变量)
  • 同样从您的其他代码来看,您的属性“x”似乎是一个双精度的。所以双精度编码的占位符是
    %lf
    ,而不是
    %@
    <代码>%@
用于NSObject(及其子体)
  • NSString文本以@开头。所以
    @“X:“
    是一个NSString文本。你得到的是一个C字符串
  • 编辑


    嗯,我和往常一样慢。:)忽略我所说的,接受邓肯的回答,事实上,邓肯的回答更快、更清晰。

    我认为我们的编辑在帖子中出现了错误。我改变了对问题的看法!:):)谢谢你的回复。我还没有找到任何东西来解释所有的
    %@,%g
    等,但我整个下午都在拼命反对这些东西,现在一切都正常了。我添加了一个指向苹果文档的链接,这是关于字符串格式说明符的权威指南,在你了解它们之前,它们是令人困惑的:)谢谢你的回复——整个下午我都在试图自己解决这个问题,在这里发布的10分钟内,有两个答案指出了我的问题。非常感谢!