具有Objective-C属性的EXC_BAD_ACCESS

时间:2009-07-28 04:59:42

标签: iphone objective-c cocoa cocoa-touch properties

在我的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时,我仍然会得到这种行为!

由于

3 个答案:

答案 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的位置发布代码并调用初始化方法?