ARCを使ってiOSで "self.delegate = self"が動作しない

私は、ARCを有効にしたiOS SDK 4プロジェクトに取り組んでいます。

私のクラス MyTextView (UITextViewから UITextViewDelegate プロトコルで派生)は、次の静的メソッドを実装しています:

+ (void)showInViewController:(UIViewController*)viewController
{
    MyTextView *textEdit = [[MyTextView alloc] init];
    textEdit.delegate = textEdit;
    [viewController.view addSubview:textEdit];

   //Show the keyboard
    [textEdit becomeFirstResponder];
}

私のView Controllerの1つでは、以下を呼び出します。

[MyTextView showInViewController:self]

これは becomeFirstResponder warning:以前に選択したフレームを復元できません。でクラッシュします。いくつかのサイクルのためにいくつかのスタック関連のクラッシュのように見えます。私はARCにはかなり新しいです。 UITextView のデリゲートプロパティは assign として定義されています(ARCでは weak と解釈してはいけません)。私はこのアプローチがむしろ奇妙な記憶であることを知っています。しかし、ARCがそのようなことを処理できるかどうかを知りたかったのです。明らかにそれはできません。どのようなアイデアが問題であり、どのように解決するのか?

2
ありがとうございました。それに応じてタイトルを変更しました。
追加された 著者 Lars Schneider,
問題は、デリゲートの割り当てとaddSubviewのどちらの呼び出しも、textEditオブジェクトの「保持」を実行しないようです。したがって、メソッドの最後に解放されます。
追加された 著者 Lars Schneider,
@chrispix:あなたは正しいです - 少なくともARC以外の方には賢明です。実際、それが私の解決策でした。私はMyTextViewオブジェクトの強力な参照を呼び出しビューコントローラに保持します。しかし、私はARCがこのようなことを処理できるかどうか疑問に思っています(しかし、ARCはまったくガベージコレクションではありません)。
追加された 著者 Lars Schneider,
@chrispix:いいえ、クラスメソッドを変更して、実際のオブジェクトへのポインタを返しました。
追加された 著者 Lars Schneider,
保持サイクルは一般的にクラッシュを引き起こさず、オブジェクトの割り当てを解除することができません。
追加された 著者 Caleb,
私は特定の問題が何であるかはわかりませんが、このアプローチは本当に問題があるようです。 showInViewController:を実行すると、MyTextViewインスタンスへの参照はありません。それはスーパービューによって保持されるべきですが、あなたはそれを参照する良い方法がないので、メッセージを渡すことも、テキストの値を抽出することもできません。その上でハンドルを取得する唯一の方法は、superviewのサブビューを歩くことです。
追加された 著者 Christopher Pickslay,
どのようにMyTextViewオブジェクトへの強い参照を保持していますか? voidを返すクラスメソッドを呼び出すことによって作成します。
追加された 著者 Christopher Pickslay,
その後、質問のコードを更新する必要があります。
追加された 著者 Christopher Pickslay,
これは奇妙なパターン(独自のデリゲートであるビューを持つ)ですが、それ以外に、デリゲートを設定する行(デリゲートが設定されていません)をコメントアウトしてクラッシュがまだ発生しているかどうかを確認することで、
追加された 著者 XJones,
割り当ては弱いものと同じではありません。 Weakはassignとよく似ていますが、強い参照が解放されると弱い変数はなくなります。
追加された 著者 James,
assign プロパティは、iOS 4用にコンパイルするときに unsafe_unretained プロパティになります。
追加された 著者 Alex Nichol,
これを答えるのに十分ではないが、おそらく[super setDelegate:self];それを解決する。
追加された 著者 Aberrant,

2 答え

私はそれがARCとメモリ管理とは関係ないと思うが、 UITextView がそれ自身の代理人になれないという根本的な問題である。それはループでロックされます。ロギングメッセージを textViewDidChangeSelection に置くと、繰り返し呼び出されることがわかります。メモリの問題ではなく、methinksではなく、 UITextView デリゲートの論理的な問題です。問題のある showInViewController ではなく、標準の UITextView サブクラスを作成し、そのデリゲートを自分自身に設定しようとしても、同じ好奇心を抱いた動作が見られます。

1
追加された
0
追加された