ich einen Delegaten Objekt erstellt habe die UITextFieldDelegate in seiner eigenen Klasse Implementierung namens NumericTextFieldDelegate
dann habe ich die Delegaten in meinem Controller auf diese Weise initialisiert:direkt initialisiert Delegaten erzeugen ARC Warnung und EXC_BAD_ACCESS Absturz
textFieldName.delegate = [NumericTextFieldDelegate new];
Und ich habe diese Warnung vom Compiler:
Assigning retained object to unsafe property; object will be released after assignment
das bedeutet, dass das Objekt nach der Abtretung und in der Tat freigegeben werden, wenn ich die Anwendung auszuführen, und ich konzentriere, um den UITextField ich erhalte ein EXC_BAD_ACCESS
ein nd der App Absturz ...
Der einzige Weg, es funktioniert, dass ich gefunden wird eine statische Variable mit einer Factory-Methode zu schaffen, die die Instanz der NumericTextFieldDelegate
Versand:
@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
Und dann, wenn ich zuweisen die Delegierten auf diese Weise:
textFieldName.delegate = [NumericTextFieldDelegate getDelegate];
alles funktioniert gut, aber meine Frage ist:
Warum kann ich nicht einfach eine anonyme neue Instanz der Klasse zuweisen? Warum wird das Objekt nach der Zuweisung automatisch freigegeben?
Warum brauche ich diese Problemumgehung?
Danke.
Es ist ein UITextField, nicht benutzerdefiniert. – aleroot
Methoden sollten nicht mit "get" vorangestellt werden, es sei denn, sie sind von einem sehr spezifischen Typ (was dieser nicht ist). – bbum
@bbum ich habe das get Präfix von Java geerbt :-) Danke für den Tipp – aleroot