2012-11-19 26 views
0

我有一個屬性,當啓動一個新的視圖控制器時被設置。loadView無法訪問我的屬性,拋出EXC_BAD_ACCESS

- (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

是整型VALU e表示const TEST_ROUTE包含。

現在,當我安裝我的斷點,AT的的NSLog的時間,檢查顯示我的對象包含

Self > 
    r > 
     Route: 1 

r > 
    Route: 1 

那麼該屬性是可用的,而且它含有正確的數據。但是當我嘗試訪問屬性時,它會拋出一個EXC_BAD_ACCESS。

想法? :)(這是在這裏殺死我!)

回答

2

有幾個問題在這裏:

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

我認爲自動釋放消息應該在這裏,而不是發送到RouteViewControllerRoute對象,因爲getRoute方法應該由於命名約定而返回自動釋放對象。

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

您需要保留傳遞到initWithRoute方法路由對象的所有權:

或者:

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

    r = [route retain]; 

    return self; 
} 

或:

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

    self.r = route; 

    return self; 
} 
+0

我很欣賞不僅回答得很快,而且回答正確,提供了額外的信息和替代方法,而且不會質疑爲什麼事情會按照它的方式完成(我有點看着你的Matt> _>從別人那裏傳給我的項目沒有機會以清理任何東西:p) – RedactedProfile

+0

正如在另一個答案中提到的,我更習慣於弧,我不知道我必須「保留」在那裏。如果XCode比「EXC_BAD_ACCESS」更加明顯地握住我的手,那麼也可能會有所幫助 – RedactedProfile

2

它看起來像你沒有使用ARC,但你也沒有保留你的init方法的路線。更改此:

r = route; 

這樣:

r = [route retain]; 
+0

或更好但是,啓用A RC並使用屬性而不是直接訪問實例變量。 –

+0

這是魔術詞!是的,我是一名iOS5開發人員,我主要使用ARC,這屬於4.3的傳統項目。 – RedactedProfile