1

uitextfieldサブクラスとinitメソッドがあり、これsetDelegateがあります:

- (void) setDelegate:(id<UITextFieldDelegate>)paramDelegate{
    [super setDelegate:paramDelegate];

    MRAAdvancedTextFieldDelegate *limitedDelegate = [[MRAAdvancedTextFieldDelegate alloc] init];
    self.delegate = limitedDelegate;
}

ARC を使用していますが、BAD_ACCESS になります。何か案は?

4

2 に答える 2

0

self.delegate = limitedDelgateメソッド内に書き込みますsetDelegate:。これは、を呼び出すのとまったく同じ[self setDelegate:limiatedDelegate]です。あなたは-setDelegate:メソッド自体の中にいるので、あなたは不潔な再帰を引き起こしています。お役に立てれば!

編集:あなたの意図についてのあなたのコメントに従って、次のようにそれを上書きします:

- (void) setDelegate:(id<UITextFieldDelegate>)paramDelegate{
    MRAAdvancedTextFieldDelegate *limitedDelegate = [[MRAAdvancedTextFieldDelegate alloc] init];
    [super setDelegate:limitedDelegate];
}

しかし、これを行うのは良い考えではないと思います。代わりに、デリゲートのインスタンスでクライアントコードを渡す必要があります。

于 2012-08-30T21:41:43.820 に答える
0
self.delegate = limitedDelegate;

に変わります

[self setDelegate:limitedDelegate];

コンパイラによって、無限ループが発生します。解決策: プロパティを使用する代わりに、カスタム セッター メソッドで代わりにインスタンス変数を使用します。

delegate = limitedDelegate;
于 2012-08-30T21:43:23.690 に答える