0

新しいView Controllerを開始するときに設定されるプロパティがあります。

- (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 は、constTEST_ROUTEに含まれる int 値です。

今、ブレークポイントを設定すると、NSLog の時点で、インスペクターはオブジェクトに含まれていることを示します

Self >
    r >
       Route: 1

r >
    Route: 1

したがって、プロパティは利用可能であり、正しいデータが含まれています。しかし、プロパティにアクセスしようとすると、EXC_BAD_ACCESS がスローされます。

考え?:) (これは私をここで殺しています!)

4

2 に答える 2

2

ARC を使用していないように見えますが、init メソッドでルートも保持していません。これを変える:

r = route;

これに:

r = [route retain];
于 2012-11-19T18:25:40.283 に答える
2

ここにはいくつかの問題があります。

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

命名規則により、メソッドは自動解放されたオブジェクトを返す必要があるため、自動解放メッセージはオブジェクトでRouteViewControllerはなく、ここに送信する必要があると思います。RoutegetRoute

すなわち

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;
}
于 2012-11-19T18:27:01.377 に答える