“self.delegate = self”不能在使用 ARC 的 iOS 上运行

Posted

技术标签:

【中文标题】“self.delegate = self”不能在使用 ARC 的 iOS 上运行【英文标题】:"self.delegate = self" not working on iOS using ARC 【发布时间】:2011-10-28 06:47:22 【问题描述】:

我正在开发一个启用了 ARC 的 ios SDK 4 项目。

我的类MyTextView(从带有UITextViewDelegate 协议的UITextView 派生)实现了以下静态方法:

+ (void)showInViewController:(UIViewController*)viewController

    MyTextView *textEdit = [[MyTextView alloc] init];
    textEdit.delegate = textEdit;
    [viewController.view addSubview:textEdit];

    // Show the keyboard
    [textEdit becomeFirstResponder];

在我的一个视图控制器中,我调用以下代码:

[MyTextView showInViewController:self]

这在becomeFirstResponder 上与warning: Unable to restore previously selected frame. 一起崩溃。由于某些循环,看起来像一些与堆栈相关的崩溃。我对ARC相当陌生。 UITextView 的委托属性定义为 assign(ARC 不应该将其解释为 weak 吗?)。我知道这种方法在记忆方面相当奇怪。但是,我想知道 ARC 是否可以处理这样的事情。显然不能。知道可能是什么问题以及如何解决吗?

【问题讨论】:

保留周期通常不会导致崩溃——它们只是防止对象被释放。 谢谢迦勒。我相应地修改了标题。 甚至不能确定这个答案,但也许 [super setDelegate:self];解决它。 赋值不等于弱。 Weak 很像 assign,但是一旦所有的强引用被释放,弱变量就会变成 nil。 @chrispix:不,我更改了类方法以返回指向实际对象的指针。 【参考方案1】:

我认为这与 ARC 和内存管理没有任何关系,而只是一个更基本的问题,UITextView 不能成为其自身的代表。它被锁定在一个循环中。在textViewDidChangeSelection 中输入一条日志消息,您会看到它被反复调用。我认为这不是内存问题,而只是UITextView 代表的逻辑问题。即使您不执行有问题的showInViewController,而只是创建一个标准的UITextView 子类并尝试将其委​​托设置为自身,您也会看到同样奇怪的行为。

【讨论】:

【参考方案2】:

旧帖,但这里是答案:

http://www.cocoabuilder.com/archive/cocoa/282093-uitextview-as-its-own-delegate-infinite-loop-on-keyboard-select.html

这里也有

self.delegate = self; what's wrong in doing that?

【讨论】:

以上是关于“self.delegate = self”不能在使用 ARC 的 iOS 上运行的主要内容,如果未能解决你的问题,请参考以下文章

使用 self.delegate 子类化 UITextField 会导致应用程序冻结,CPU 峰值达到 100%

为啥辞职急救人员不隐藏键盘?

我不能在 VBA Access 中使用 UBound() 函数。好像不能识别

片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型

政府要求在隐私弹窗允许之前,不能联网,且不能读隐私信息

政府要求在隐私弹窗允许之前,不能联网,且不能读隐私信息