Objective c EXC_访问实例变量时出现坏访问内存问题
我在将前一段时间参与的一个Java项目移植到Objective-C代码时遇到问题-在代码的第一行,我得到了“程序接收信号:“EXC_BAD_ACCESS”: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)
-(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分钟内,有两个答案指出了我的问题。非常感谢!