我正在开发启用了 ARC 的 iOS SDK 4 项目。
我的类 MyTextView
(派生自具有 UITextViewDelegate
协议(protocol)的 UITextView)实现了以下静态方法:
+ (void)showInViewController:(UIViewController*)viewController
{
MyTextView *textEdit = [[MyTextView alloc] init];
textEdit.delegate = textEdit;
[viewController.view addSubview:textEdit];
// Show the keyboard
[textEdit becomeFirstResponder];
}
在我的一个 View Controller 中,我调用了以下内容:
[MyTextView showInViewController:self]
这会在 becomeFirstResponder
上崩溃并显示 warning: Unable to restore previously selected frame.
。由于某些循环,看起来像一些与堆栈相关的崩溃。我对 ARC 还很陌生。 UITextView
的委托(delegate)属性定义为 assign
(ARC 不应该将其解释为 weak
吗?)。我知道这种方法在内存方面相当奇怪。但是,我想知道 ARC 是否可以处理这样的事情。显然不能。知道可能是什么问题以及如何解决它吗?
最佳答案
我不认为它与 ARC 和内存管理有任何关系,只是一个更基本的问题,即 UITextView
不能是其自身的委托(delegate)。它被锁定在一个循环中。将日志消息放入 textViewDidChangeSelection
中,您会看到它被重复调用。我认为这不是内存问题,而只是 UITextView
委托(delegate)的逻辑问题。即使您不执行有问题的 showInViewController
而只是创建一个标准的 UITextView
子类并尝试将其委托设置为自身,您也会看到同样奇怪的行为。
关于ios - "self.delegate = self"无法在使用 ARC 的 iOS 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7926002/