loadView无法访问我的属性,抛出EXC_BAD_ACCESS

时间:2012-11-19 18:19:14

标签: objective-c ios

我有一个在启动新视图控制器时设置的属性。

- (IBAction)headerPressed:(UIButton *)sender {
    RouteViewController *route = [[RouteViewController alloc] initWithRoute:[[Route getRoute:TEST_ROUTE] autorelease]];
    [[self navigationController] pushViewController:circle animated:NO];
}

在新视图中,这是一个UIViewController

RouteViewController.h

@interface =RouteViewController : UIViewController <MKMapViewDelegate> {
    Route *r;
}

-(id)initWithRoute:(Route *)route;


@property (retain, nonatomic) Route *r;

RouteViewController.m

-(id)initWithRoute:(Route *)route{
    self = [super init];

    r = route;

    return self;
}
- (void)loadView {
    [super loadView];

    NSLog(@"TEST: %d", r.Route);  // throws exception. Actually ANY time I access my r property

}

r.Route是const TEST_ROUTE包含的int值。

现在,当我设置断点时,在NSLog时,检查员显示我的对象包含

Self >
    r >
       Route: 1

r >
    Route: 1

因此该属性可用,并且它包含正确的数据。但是当我尝试访问该属性时,它会抛出一个EXC_BAD_ACCESS。

思考? :)(这在这里杀了我!)

2 个答案:

答案 0 :(得分:2)

看起来你没有使用ARC,但你也没有在init方法中保留路由。改变这个:

r = route;

到此:

r = [route retain];

答案 1 :(得分:2)

这里有一些问题:

RouteViewController *route = [[RouteViewController alloc] initWithRoute:[[Route getRoute:TEST_ROUTE] autorelease]];

我认为autorelease消息应该发送到RouteViewController这里而不是Route对象,因为getRoute方法应该返回一个自动释放的对象,因为命名约定。

RouteViewController *route = [[[RouteViewController alloc] initWithRoute:[Route getRoute:TEST_ROUTE]] autorelease];

您需要保留传递到initWithRoute方法的Route对象的所有权:

或者:

-(id)initWithRoute:(Route *)route{
    self = [super init];

    r = [route retain];

    return self;
}

或:

-(id)initWithRoute:(Route *)route{
    self = [super init];

    self.r = route;

    return self;
}