アプリのコードを最適化しようとしています。すべて共通の「キーパッド」を使用する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: これは短くするための疑似コードです。タイプミスがないことを願っています。そうであれば、それは問題ではありません。:)