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];

由编译器,导致无限循环。解决方案:不要使用属性,而是在自定义setter方法中使用实例变量:

delegate = limitedDelegate;
于 2012-08-30T21:43:23.690 回答