0

私はクラスを作成し、非アーク プロジェクトで現在のビューに追加します。その後、このようにリリースしています。

  TestViewController *tView=[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
tView.view.frame=CGRectMake(10, 10,tView.view.frame.size.width , tView.view.frame.size.height);
[self.view addSubview:tView.view];
[tView release];

TestViewController にボタンを追加しました。ボタンを押すと、クラッシュしてコンソールからこのメッセージが表示されます。

-[TestViewController performSelector:withObject:withObject:]: message sent to deallocated instance 

その理由を説明できる人はいますか?

4

4 に答える 4

2

を呼び出すと、[tView release]; TestViewControllerdeallocメソッドが自動的に呼び出されます。そしてObjects、このクラスの になりますreleased。おそらく、あなたは でそのボタンを離したのでしょうdealloc。そのため、アプリがクラッシュしています。

これは正しい方法ではありません。self.viewを追加する代わりに、カスタム ビューを作成してそのビューを に追加する必要がありviewcontrollerますview

于 2013-06-17T10:26:04.093 に答える
0

明らかに、ボタンのターゲットは tView です。[tView release] の後に、retainCount が 0 に減少すると、[tView dealloc] が呼び出されます。tView を _tView などのプライベート メンバー変数として宣言し、View Controller の dealloc 関数で [_tView release] を呼び出す必要があります。

@interface **
{
    TestViewController *_tView;
}

if(!_tView){
    _tView=[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
}
_tView.view.frame=CGRectMake(10, 10,tView.view.frame.size.width , _tView.view.frame.size.height);
[self.view addSubview:_tView.view];

iOS 5.* では、カスタム コンテナー ビュー コントローラーがサポートされています。( http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html ) 次のようなコードを記述できます。

TestViewController *tView=[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
tView.view.frame=CGRectMake(10, 10,tView.view.frame.size.width , tView.view.frame.size.height);
[self.view addSubview:tView.view];
[self addChildViewController:tView];
[tView didMoveToParentViewController:self];
[tView release];
于 2013-06-17T10:52:12.513 に答える
0

現在、TestViewControllerインスタンスをlocalとして宣言しています。そのため、インスタンスにあるコントロールにアクセスしているときにクラッシュするだけです。

クラスレベル(ivar)でTestViewControllerのインスタンスを宣言して使用します。

于 2013-06-17T10:30:43.920 に答える
-1

以下のコードを使用できます

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(aMethod:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Show View" forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
    [self.yourViewController addSubview:button];

self.viewController は、ビューコントローラーを .h ファイルで定義し、ビューコントローラーのインスタンスを使用してボタンを追加することを意味します。

その後、viewController [ViewController Release] を解放できます。

于 2013-06-17T10:25:37.423 に答える