2

Я работаю над проектом iOS SDK 4 с включенным ARC.«self.delegate = self» не работает на iOS, используя ARC

Мой класс MyTextView (полученный из UITextView с UITextViewDelegate протоколом) реализует следующий статический метод:

+ (void)showInViewController:(UIViewController*)viewController 
{ 
    MyTextView *textEdit = [[MyTextView alloc] init]; 
    textEdit.delegate = textEdit; 
    [viewController.view addSubview:textEdit]; 

    // Show the keyboard 
    [textEdit becomeFirstResponder]; 
} 

В одном из моих контроллеров зрения я называю следующее:

[MyTextView showInViewController:self] 

Это падает с warning: Unable to restore previously selected frame. на becomeFirstResponder. Похоже, какой-то столкновение связано с кадром из-за некоторого цикла. Я довольно новичок в ARC. Свойство делегирования UITextView определяется как assign (не следует ли интерпретировать ARC как weak?). Я знаю, что этот подход довольно странный по памяти. Тем не менее, я хотел знать, сможет ли ARC справиться с такими вещами. Очевидно, это невозможно. Любая идея, что может быть проблемой и как ее решить?

+2

Сохранил циклы обычно не вызывают сбои - они просто предотвратить объекты из когда-либо перераспределена. – Caleb

+0

Спасибо, Калеб. Я соответствующим образом изменил название. –

+0

Даже не уверен, чтобы ответить на этот вопрос, но, возможно, [super setDelegate: self]; решает его. – Aberrant

ответ

1

Я не думаю, что это имеет какое-то отношение к ARC и управлению памятью, но только более фундаментальная проблема, что UITextView не может быть делегатом сам по себе. Он блокируется в цикле. Поместите сообщение регистрации в textViewDidChangeSelection, и вы увидите, что он многократно вызывается. Не проблема с памятью, но только логическая проблема с делегатами UITextView. Даже если вы не делаете свой проблемный showInViewController, а просто создайте стандартный подкласс UITextView и попытайтесь установить его делегат сам по себе, вы увидите то же любопытное поведение.