我在自己的类中创建了一个实现UITextFieldDelegateNumericTextFieldDelegate
的委托对象,然后我以这种方式在我的控制器中初始化了委托:
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];
一切正常,但我的问题是:
为什么我不能简单地分配一个匿名的新类实例? 为什么赋值后对象会自动释放?
为什么我需要这个解决方法?
谢谢。