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

时间:2012-05-28 11:50:20

标签: iphone ios copywithzone

我觉得我正在把头撞到墙上(坦白说,我已经准备好了)。

我正在尝试为视图设置背景。我需要设置的背景是一个图像,我正在使用这个代码(在其他两个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)

没有别的 - 在之前或之后。

7 个答案:

答案 0 :(得分:190)

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

经过进一步调查,结果发现名称title导致了问题。我把标签声明为

IBOutlet UILabel *title;

一旦我将名称更改为gtitle,一切都按预期工作。谁知道?..

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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

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

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

希望这有帮助

在您的第一次评论后编辑

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

为了更好地分析这个问题,当引发异常时,我会写入调试器:

copyWithZone

看看一切是否顺利进行。

答案 3 :(得分:0)

这个问题昨晚发生在我身上,我确实有一个名为title的标签。当把名字换成别的东西不起作用时,我撕掉了一点头发。事实证明,我试图将NIL值从文本字段发送到VC中的标签。我有4个VC,用户在文本字段的VC 1中输入标题,并将其存储到NSString类型的对象中。该字符串被放入VC 4中的标签中。当用户没有在VC 1中输入标题时,这就是NIL进入的地方。当用户没有在VC1中输入标题时,我通过为字符串对象指定默认值来修复它。希望能帮助别人。

答案 4 :(得分:0)

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

然而,在我的情况下,我有一个名为UIDateLabel的类(用于以格式化方式显示日期等)。编译和运行导致上面提到的NSInvalidArgumentException。

我怀疑可能有一个类似的类,但在UIDateLabel上的Google搜索只显示了一些不明显的命中(并且没有任何链接到Apple,因为我可以看到)。所以我认为暂时没有命名问题......直到我在这里阅读答案并试一试。

所以我把名字换成了UIDateLabelAbc,一切都很完美。重命名回UIDateLabel不起作用,因为XCode告诉我已经有一个具有该名称的类。所以我做了一些谷歌搜索,发现一些声称列出UIKit.framework继承层次结构的维基页面,在该列表中我找到了UIDateLabel列出。然而,这是我设法找到的关于该类的所有信息,即它存在。它的作用,目的等等目前还不为我所知。

<强>更新 在阅读了有关命名约定之后,我现在意识到为类添加UI前缀并不是一种好的做法(至少可以这么说)。所以,不要在你的类前面添加UI,你可以避免这种情况,也可能是其他一些问题。

答案 5 :(得分:0)

当我声明一个IBOutlet变量时,我得到这个错误,并给它与该视图控制器中的其他名称相同的名称。因此,更明智地重命名我的变量和函数

答案 6 :(得分:0)

雨燕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)
{

}