ios - "self.delegate = self"无法在使用 ARC 的 iOS 上工作

标签 ios static uitextview automatic-ref-counting uitextviewdelegate

我正在开发启用了 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/

相关文章:

ios - SwiftUI Rectangle 突然变成 RoundedRectangle

ios - 如何更改 UITextView 的溢出字符颜色?

iOS - 缺少推送通知授权

ios - Audio Units支持airplay吗?

iphone - iOS 能够在模拟器上读取 plist 文件,但不能在设备上读取

c# - 要求在 C# 中存在静态方法

java - 具有通用签名的接口(interface)中的静态方法

objective-c - 在 Objective-c 的实现中放置变量

iOS:如何将可滚动 TextView 添加到应用程序首选项?

ios - UITextView文字排列