【发布时间】:2011-09-03 03:08:55
【问题描述】:
我的类中有一个名为 location 的属性,它使用非原子的 retain 属性。但是,当我第一次将它分配给某个东西时,我收到了 EXC_BAD_ACCESS 错误。它在以下代码中的分配上崩溃:
- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if(!self.location)
{
self.location =
[[Point2D alloc] initWithX:newLocation.coordinate.longitude Y:newLocation.coordinate.latitude];
}
据我记得,当您使用保留属性时,它会自动释放当前对象并在您合成新对象时保留它。我认为它抛出了这个错误,因为我正在发布一些不存在的东西。但是有没有办法解决这个问题,还是我看错了?此外,当我使用变量本身时它不会抛出错误,只有当 self.被使用了。
这也是我的 Point2D 课程信息:
@interface Point2D : NSObject {
}
@property (nonatomic, assign) float x, y;
-(id)initWithX:(float)nx Y:(float)ny;
@end
@implementation Point2D
@synthesize x = _x, y = _y;
-(id)init
{
return [self initWithX:0.00 Y:0.00];
}
-(id)initWithX:(float)nx Y:(float)ny
{
self = [super init];
self.x = nx;
self.y = ny;
NSLog(@"initWithX");
return self;
}
@end
【问题讨论】:
-
Point2D的初始化器呢?合适吗? -
请注意,您可以向
nil发送任何消息(包括release)并且不会发生任何事情。默认情况下,新创建对象的实例变量初始化为零,因此任何指针都包含nil。因此,如果您之前设置了location实例变量,您只会获得 EXC_BAD_ACCESS。导致 EXC_BAD_ACCESS 的值可能在其他地方。没有足够的sample code 来说明正在发生的事情。最好的办法是使用 XCode 的调试器进入locationManager:didUpdateToLocation:fromLocation:并检查所有值。 -
是的,我已经使用
@synthesize location = _location;合成了属性当我将 self.location 更改为 _location 它可以工作但我需要将它用于属性所以我不确定为什么它会在我用自己。当我尝试将 self.location 设置为 Point2D 分配时出现错误,它可以正常输入 if 语句。 -
在一个不相关的话题上,你应该总是测试
[super init]的结果,只有在非零时才继续初始化。
标签: objective-c xcode memory-management properties retain