UITextView 委托问题
Posted
技术标签:
【中文标题】UITextView 委托问题【英文标题】:UITextView delegates problem 【发布时间】:2010-09-23 14:16:39 【问题描述】:我正在尝试访问 UITextView 委托并遇到问题
我有一个带有 UITextViewDelegate 协议的 UIViewController 和一个包含 textView 的 Nib。
如果我在 viewDidLoad 中设置委托(如“textView.delegate = self”)并触摸 textView,则应用程序会崩溃而不会记录错误。 如果我开始使用“[textView becomeFirstResponder]”之类的代码编辑 textView,则所有代表都会被调用。
当我在 Nib 中设置委托时,在 textView 和文件所有者之间创建连接并删除“textView.delegate = self”时,也不会调用任何委托。
我在这里做错了什么?
问候,
埃利亚斯
【问题讨论】:
您确定“文件的所有者”是正确的文件吗?另外,你在调用什么委托方法?请发布一些代码。 【参考方案1】:如果没有更多的描述、发布的代码或 xib 文件,帮助您并不容易。
您说应用程序崩溃而没有任何日志记录错误 - 好吧,您的意思是控制台窗口中没有输出吗?这是正常的,对于一个已经崩溃的应用程序。
无论如何,您应该能够获得堆栈跟踪以找出应用程序崩溃的大致位置。打开调试器(⇧⌘Y),查看位置。这应该让您知道出了什么问题。
您可以在此处查看此类调试器会话的示例(在 EXC_BAD_CRASH 之后):
前两行没有给我们太多信息,但稍后我们可以看到应用程序在从 NIB 文件加载用户界面时崩溃了。好吧,通常在这种加载期间执行的唯一代码是 awakeFromNib
方法 - 由你来找到这些方面的问题。
通常代码执行的顶部没有任何意义 - 例如,您可能会在某处看到您的 ViewController 方法,但顶部的几个函数调用(代码崩溃的那些)位于您从未调用过的方法/类中代码。在大多数情况下,这是错误的内存释放/分配的标志。可能发生的情况是您忘记了retain
您的一些对象,它已经被释放,但您仍然保留对其内存的引用(指针)。因为该内存实际上已被释放,后来另一个对象取而代之,通常是一些您从未听说过的 Apple 内部对象。稍后您的代码会尝试向您的可怜对象发送消息,但它会向完全不同的对象发送消息。太糟糕了!这就是你得到那些崩溃和奇怪的堆栈跟踪的方式。
要解决我刚才描述的问题,您可以使用 Instruments 及其 Zombies 工具。不幸的是,你不能从 Xcode 中启动 Zombies,你需要独立启动 Instruments,然后选择 iPhone Simulator/Memory
下的 Zombies,然后从工具栏中选择 Choose Target
,你应该在那里看到你的应用程序,或者能够导航到它在文件系统上。
Zombies instrument 的作用是在对象被释放后它永远不会真正释放内存。相反,它会将这些对象变异为 NSZombie 类。该类拦截对自身的所有调用,并在某些代码尝试向其发送消息时通知您。
这就是 Instruments 会话的样子(这与上面调试器中看到的崩溃相同):
在表格中,您可以看到我们正在尝试向已释放的 UIScrollView 发送消息。您还可以查看对该特定对象的保留/释放调用的整个历史记录。这样您就可以找到丢失的保留或错误的释放/自动释放。
记住 - Zombies Instruments 只能与模拟器一起使用,因为真实设备上没有足够的内存来保存所有这些内存块。
希望我能帮助您进一步分析您的问题。
【讨论】:
以上是关于UITextView 委托问题的主要内容,如果未能解决你的问题,请参考以下文章
UItextView 委托 swift - textViewDidBeginEditing 未调用