0

アプリのコードを最適化しようとしています。すべて共通の「キーパッド」を使用するViewControllerがかなりあります。キーパッドを別の ViewController に抽出し、それを既存の ViewControllers に含めたいと考えました。このようにして、別の ViewController で重複したコード (キーパッドからの反応を処理するために必要だった) を取り除くことができました。

したがって、KeyPadVC には、次のようなメソッドが設定されています。

-(IBAction)keyPadKeyPressed:(id)sender
{
    [self.delegate interpretKeyPressed:[[sender titleLabel] text]];
}

「親」の ViewControllers には、Interface Builder に配置したプレーンな UIView にサブビューを追加して (視覚的なプレースホルダーを用意するため)、変数に接続してキーパッドを含めますkeypadView

-(void) viewDidLoad
{
    [super viewDidLoad];

    KeyPadViewController *kpVC = [[KeyPadViewController alloc] init];
    [kpVC setDelegate: self];
    [[self keypadView] addSubview:[kpVC view]];
}

これは正常に表示されますが、オブジェクトが既に解放されているため、KeyPadViewController のボタンを押すとゾンビ オブジェクトが表示されます。次に、で宣言しようとしKeyPadViewController *kpVC@interface次のような自己インスタンス化メソッドを試しました。

-(KeyPadViewController *)kpVC
{
    if (!kpVC) {
        kpVC = [[KeyPadViewController alloc] init];
    }
    return kpVC;
}

明らかにviewDidLoad方法を変更しましたが、結果は常に同じでした。オブジェクトがリリースされるのが早すぎます。NSLogs を追加する-(IBAction)keyPadKeyPressedと、KeyPadVC は既にリリースされているため、KeyPadVC から呼び出されないことがわかります。

私は何を間違っていますか?ARC と iOS6 SDK を使用しています。

ありがとう

PS: これは短くするための疑似コードです。タイプミスがないことを願っています。そうであれば、それは問題ではありません。:)

4

1 に答える 1

0
KeyPadViewController *kpVC = [[KeyPadViewController alloc] init];
[kpVC setDelegate: self];
[[self keypadView] addSubview:[kpVC view]];
self.kpVC = kpVC;

それはView Controllerを保持します。

ただし、親子アーキテクチャを使用していないため、あなたがしていることは完全に違法です。ここで私の答えを参照してください: https://stackoverflow.com/a/15962125/341994

ビューにサブビューを追加することはできますが、精巧な親子アーキテクチャを経由せずに、View Controller のビューをサブビューとしてビューに追加してはなりません。そして、あなたはそれをしていません。

ここで親子アーキテクチャについて説明します。

http://www.apeth.com/iOSBook/ch19.html#_container_view_controllers

于 2013-05-03T16:52:13.507 に答える