名前付きの独自のクラスでUITextFieldDelegateを実装するデリゲート オブジェクトを作成しNumericTextFieldDelegate
、この方法でコントローラーでデリゲートを初期化しました。
textFieldName.delegate = [NumericTextFieldDelegate new];
そして、私はコンパイラからこの警告を受けました:
Assigning retained object to unsafe property; object will be released after assignment
つまり、割り当て後にオブジェクトが解放され、実際にアプリケーションを実行してUITextFieldにフォーカスするEXC_BAD_ACCESS
と、アプリがクラッシュします...
私が見つけたそれを機能させる唯一の方法は、のインスタンスをディスパッチするファクトリメソッドで静的変数を作成することですNumericTextFieldDelegate
:
@interface NumericTextFieldDelegate : NSObject <UITextFieldDelegate>
+(NumericTextFieldDelegate *) getDelegate;
@end
@implementation NumericTextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string];
// This allows backspace
if ([resultingString length] == 0) {
return true;
}
NSInteger holder;
NSScanner *scan = [NSScanner scannerWithString: resultingString];
return [scan scanInteger: &holder] && [scan isAtEnd];
}
+(NumericTextFieldDelegate *) getDelegate {
static NumericTextFieldDelegate *del;
@synchronized(del) {
if(del == nil)
del = [NumericTextFieldDelegate new];
}
return del;
}
@end
そして、この方法でデリゲートを割り当てると:
textFieldName.delegate = [NumericTextFieldDelegate getDelegate];
すべてうまくいきますが、私の質問は次のとおりです。
クラスの匿名の新しいインスタンスを単純に割り当てることができないのはなぜですか? 割り当て後にオブジェクトが自動的に解放されるのはなぜですか?
なぜこの回避策が必要なのですか?
ありがとう。