在我的iPhone应用程序中,我在构造函数中有以下行:
self.myVar = myVar_in;
其中myVar是属性,myVar_in是传递给构造函数的参数。
当我运行代码时,我在此行上收到EXC_BAD_ACCESS
错误。但是,当我用以下代码替换行时
[myVar release];
[myVar_in retain];
myVar = myVar_in;
代码运行正常。我的财产声明如下: NSNumber * myVar; ... @property(保留)NSNumber * myVar;
错误是一致的,我很肯定它不是可变范围问题。有人可以解释这种行为吗?
编辑:我已经确认myVar_in在行执行之前有效。这是实际的代码,虽然它没有多大帮助:
-(GetAddressRequestHelper*)initWithRequest:(ClientRequest*)request delegate:(id<ServerResponseDelegate>)delegate number:(NSNumber*)myVar_in location:(CLLocation*)location {
self = [super initWithRequest:request delegate:delegate];
if( self ) {
// same behavior even if this line is uncommented!!!
myVar_in = [NSNumber numberWithInt:123];
// prints "myVar_in is 123"
NSLog(@"myVar_in is %@",myVar_in);
// doesn't throw exception
/*[myVar release];
[myVar_in retain];
myVar = myVar_in;*/
// throws exception
self.myVar = myVar_in;
self.location=location;
}
return self;
}
EDIT2:我发现当我用myVar_in = [NSNumber numberWithInt:123];
显式初始化param时,我仍然会得到这种行为!
由于
答案 0 :(得分:2)
此代码之间的一个重要区别:
[myVar release];
[myVar_in retain];
myVar = myVar_in;
和这段代码:
self.myVar = myVar_in;
是使用self来调用方法(setMyVar)。
几乎可以肯定,你的对象被错误地创建/分配,而self是一个随机值(在这种情况下,myVar = myVar_in的赋值是在随机存储器上划线)。
发布显示对象创建/初始化调用的代码,以及如何衡量myVar_in获取其值的方式。同时发布您的初始化代码(您可以(非常小心地)删除多余的代码,但由于这是一个奇怪的情况,任何无关的代码可能都是相关的......
答案 1 :(得分:0)
如果您的变量有@property和@synthesize语句,请尝试使用自动生成的setter方法。这将确保myVar_in的值在分配给myVar时保留([self setMyVar:myVar_in])
您看到的错误可能是因为myVar_in在您使用时被释放。
答案 2 :(得分:0)
确保myVar_in
实际已初始化。您是否介意在初始化myVar_in
的位置发布代码并调用初始化方法?