He creado un objeto delegado de la aplicación de la UITextFieldDelegate en su propia clase llamada NumericTextFieldDelegate
entonces he inicializado el delegado en mi controlador de esta manera:delegado directamente inicializado genera la advertencia ARC y EXC_BAD_ACCESS accidente
textFieldName.delegate = [NumericTextFieldDelegate new];
y yo nos esta advertencia del compilador:
Assigning retained object to unsafe property; object will be released after assignment
eso significa que el objeto se dará a conocer después de la asignación y de hecho cuando ejecuto la aplicación y se enfoca el UITextField me sale un EXC_BAD_ACCESS
una nd el accidente aplicación ...
La única manera de hacer que funcione que he encontrado es la creación de una variable estática con un método de fábrica que despachar la instancia de la 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
Y luego, cuando le asigno el delegado de esta manera:
textFieldName.delegate = [NumericTextFieldDelegate getDelegate];
todo funciona bien, pero mi pregunta es:
por qué no puedo simplemente asignar una nueva instancia anónima de la clase? ¿Por qué el objeto se libera automáticamente después de la asignación?
¿Por qué necesito esta solución?
Gracias.
Es un UITextField, no personalizado. – aleroot
Los métodos no deben ir precedidos de 'get' a menos que sean de un tipo muy específico (que este no es). – bbum
@bbum heredé el prefijo get de Java :-) Gracias por la sugerencia – aleroot