2012-02-28 10 views
1

私はUIButtonのための目標を設定し、問題が生じています:なぜこのオブジェクトはARCで時期尚早に割り当てを解除されていますか?

// TestViewController.m 
@implementation TestViewController 

@synthesize scrollContentView 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
SecondViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 

[self.scrollContentView addSubview:secondViewController.view]; 
} 

@end 

// SecondViewController.m 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [button1 addTarget:self action:@selector(button1Click:) forControlEvents:UIControlEventTouchUpInside]; 
    button1.frame = CGRectMake(20, 45, 280, 40); 
    [self.view addSubview:button1]; 
} 

- (IBAction)button1Click:(id)sender 
{ 
    NSLog(@"test"); 
} 

私は次のエラーメッセージを取得]ボタンをクリックしたときに問題がある:

[SecondViewController performSelector:withObject:withObjectを:]:メッセージ割り当て解除インスタンスに送信 0x685c050

(lldb)

私はUIScrollViewにビューを渡しているため、コントローラにアクセスできないという問題があると想定しています。

これを解決する方法はありますか?

答えて

2

メッセージ「message sent to deallocated instance」変数は、しかし、それは、それはボタンだ含まれ、ビューのだったviewDidLoad の最後でスコープ外に行ったとき、あなたのsecondViewController変数が保持されなかったことを意味します。死んだオブジェクトへのポインタを持つライブオブジェクトに導く。あなたのクラッシュ。

ARCを使用しているので、SecondViewControllerTestViewControllerにすることが最も簡単です(おそらくハッキー)。

@implementation TestViewController{ 
    SecondViewController *secondViewController; // with ARC ivars are strong by default 
} 

その後にviewDidLoadに行を変更します。

secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 

しかし、私は正しい方法は、(もちろん、私はあなたのアプリケーションの詳細を知らない)は、おそらく使用するだろうと信じています:

- (void)addChildViewController:(UIViewController *)childController __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); 

これはiPhone/iPod touchアプリの場合の注意です。 Appleは、これらのデバイスでは、比率は一般的にコンテンツの1つのスクリーンに対する1つのビューコントローラであるべきだと述べている。もう一度私はあなたのアプリの詳細を知らない、それを言及したいだけです。

+0

ありがとうNJones。最初の解決策は機能しませんでしたが、2番目の解決策がありました。 – jonnycage

関連する問題