我有一个在启动新视图控制器时设置的属性。
- (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。
思考? :)(这在这里杀了我!)
答案 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;
}