[UILabel copyWithZone:]:无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】[UILabel copyWithZone:]:无法识别的选择器发送到实例【英文标题】:[UILabel copyWithZone:]: unrecognized selector sent to instance 【发布时间】:2012-05-28 11:50:19 【问题描述】:

我觉得我在这里撞到了墙上(坦率地说,我已经准备好这样做了)。

我正在尝试为视图设置背景。我需要设置的背景是一个图像,我正在使用这个代码(它在其他两个 UIViewController 子类中工作得很好 - 这是一个复制/粘贴到新文件中):

UIImage *img = [gameNode imageFromKey:@"background"];
UIColor *bg = [[UIColor alloc] initWithPatternImage:img];
self.view.backgroundColor = bg;
[bg release];

正如我所说,这在其他两个地方都可以正常工作,但是在这里,self.view.backgroundColor = bg 行会抛出

'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x9259840'

没有什么可做的了。我在 IB 中验证了***视图的引用出口设置为文件的所有者。我清理了项目并重新启动。我什至关闭了 Xcode 并再次重新启动它 - 没有运气。我还缺少什么?

编辑:正如我所提到的,没有太多的回溯堆栈跟踪,只是这样:

2012-05-28 13:13:56.997 OOKL[36012:17303] -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0
2012-05-28 13:13:56.997 OOKL[36012:17303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0'
*** First throw call stack:
(0x2933052 0x44c7d0a 0x2934ced 0x2899f00 0x2899ce2 0x2935bd9 0xaa92dd 0x6a4f40 0x6a4eeb 0x6bfd60 0xc0191a 0x2934e1a 0x289e821 0xc0046e 0xaa7e2c 0xaa83a9 0xaa85cb 0xb2b59 0xb1969 0x2934ec9 0x9e55c2 0x9e555a 0xa8ab76 0xa8b03f 0xa8a2fe 0xa0aa30 0xa0ac56 0x9f1384 0x9e4aa9 0x2ac6fa9 0x29071c5 0x286c022 0x286a90a 0x2869db4 0x2869ccb 0x2ac5879 0x2ac593e 0x9e2a9b 0x214d 0x20c5)

没有别的——之前或之后。

【问题讨论】:

您的标签在此视图中是否正确连接?似乎是 IB 中标签的问题。在您的 .h 文件中创建这样的访问器。 @property (assign) IBOutlet UILabel *label; 在您的 gdb 或 lldb 控制台中,键入 bt 以获取回溯 【参考方案1】:

我猜这是 Xcode 中无法每次都跟踪或重现的奇怪错误之一。我将问题缩小到 IB 中的一个特定 UILabel。一旦我将它连接到IBOutlet UILabel *,我就会收到此错误。

经过进一步调查,事实证明是名称 title 导致了问题。我将标签声明为

IBOutlet UILabel *title;

我将名称更改为 gtitle 后,一切都按预期进行。谁知道?..

【讨论】:

只是我的问题,使用标题。问题是,在另一个文件中我也使用了标题,但一切都很好。 这简直要了我的命……谢谢!事后看来,对于 ivar 来说绝对是一个糟糕的选择,但它并不重要,所以我默认命名它。来自 Xcode 的超差错误消息 @Orlando Leite。 'title' 会导致问题,因为您在 'UIViewController' 子类中。 'UIViewController' 类已经有一个成员标题。如果你有一个导航栏,你可以设置'title'字符串,它会出现在导航栏上。因此,如果您将“标题”视为标签,则会出现错误,因为“标题”实际上是“NSString”。 我还必须将标题重命名为 somthing 并重新连接它运行并再次连接 我总是在变量前面加上一个缩写。控制类型。例如tvNotes 用于文本视图,lblName 用于标签,...有助于避免任何损坏【参考方案2】:

试试这个:

self.view.backgroundColor = [UIColor clearColor];
self.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:img].CGColor;

【讨论】:

试过这个 - self.view.backgroundColor = [UIColor clearColor] 导致完全相同的错误。【参考方案3】:

这绝对看起来像是一个“过度发布”的问题。

在您的示例中很难说出原因(因为代码看起来非常好),但事实上您在 UILabel 的实例上发送了 copyWithZone 选择器(而不是 UIColor)这一事实肯定会告诉我bg 已被过度释放,现在指的是UILabel

稍后在代码中检查您是否不再释放对象bg

希望对你有帮助

第一次发表评论后编辑

您收到copyWithZone unrecognized selector sent to instance 这很奇怪,因为我相信如果您的self.view 类型错误(不是UIView),那么您会收到setBackgroundColor unrecognized selector sent to instance 而不是copyWithZone.

为了更好的分析这个问题,当出现异常时,我会写入调试器:

po [self view]
po [[self view] backgroundColor]

看看一切是否顺利。

【讨论】:

问题似乎出在self.view,因为self.view.backgroundColor = [UIColor whiteColor]导致完全相同的错误。 很奇怪,我已经编辑了我的答案,使它比简单的评论更清晰。【参考方案4】:

这个问题昨晚发生在我身上,实际上我确实有一个名为 title 的标签。将名称更改为其他名称不起作用时,我扯掉了一点头发。事实证明,我试图将 NIL 值从文本字段发送到 VC 中的标签。我有 4 个 VC,用户在文本字段中输入 VC 1 的标题,并将其存储到 NSString 类型的对象中。该字符串被放入 VC 4 中的标签中。当用户没有在 VC 1 中输入标题时,这就是 NIL 出现的地方。当用户没有在 VC1 中输入标题时,我通过为字符串对象分配默认值来修复它。希望对某人有所帮助。

【讨论】:

【参考方案5】:

我有一个类似的问题,我设法使用此处提供的答案解决了。

然而,就我而言,我有一个名为 UIDateLabel 的类(用于以格式化的方式呈现日期等)。编译运行导致上面提到的NSInvalidArgumentException。

我怀疑也许有一个这样的类,但是在 UIDateLabel 上搜索只显示了一些晦涩的点击(我可以看到没有与 Apple 相关联)。所以我认为暂时没有命名问题......直到我在这里阅读了答案并尝试了一下。

所以我将名称替换为 UIDateLabelAbc,一切正常。重命名回 UIDateLabel 不起作用,因为 XCode 告诉我已经有一个具有该名称的类。所以我做了更多的谷歌搜索,发现了一些声称列出 UIKit.framework 继承层次结构的 wiki 页面,在该列表中我发现 UIDateLabel 列出了。但是,这就是我设法找到的有关该课程的所有信息,即它存在。目前我还不知道它的作用、目的等。

更新: 在阅读了命名约定之后,我现在意识到在你的类前面加上 UI 并不是一个好的做法(至少可以这么说)。所以,不要在你的类前面加上 UI,这样你就可以避免这个问题,并且可能会出现很多其他问题。

【讨论】:

【参考方案6】:

当我声明一个 IBOutlet 变量并为其赋予与该视图控制器中的其他名称相同的名称时,我收到此错误。更明智地重命名我的变量和函数因此解决了这个问题

【讨论】:

【参考方案7】:

斯威夫特 5 在我的情况下

YOURBUTTON.addTarget(self, action: #selector(funCross), for: .touchUpInside)

//MARK:- My Function 
@objc func funWithSearch(screen: String)




if you focus on #selector(funCross) i am calling a function without object

当我使用它时它工作正常

YOURBUTTON.addTarget(self, action: #selector(funTemp), for: .touchUpInside)

//MARK:- My Function 
@objc func funTemp()

    funWithSearch(screen: "etc your desire string")


//MARK:- My Function 
@objc func funWithSearch(screen: String)



【讨论】:

以上是关于[UILabel copyWithZone:]:无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

NSInvalidArgumentException/copyWithZone 异常与 NSMutableDictionary

如何使用 copyWithZone 进行深层复制以复制结构?

错误:静态成员 copyWithZone 不能用于 UIImageView 类型的实例

[__NSCFTimer copyWithZone:]:无法识别的选择器发送到实例

cocoa -[Person copyWithZone:]: 无法识别的选择器发送到实例

Cocoa NSOutlineView 错误 - [NSCFTimer copyWithZone:]: 无法识别的选择器发送到实例