[UILabel copyWithZone:]: 未识别的选择器发送给实例

63

我感觉我在这里碰壁了(而且坦率地说,我已经准备好这样做了)。

我想要将视图的背景设置为一张图片,我正在使用这段代码(在其他两个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'

这里没有更多的信息可以参考。我在 Interface Builder 中验证了顶层视图的引用出口已设置为文件的所有者。我清理了项目并重新启动了。我甚至关闭了 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; - iOS Developer
在您的 gdb 或 lldb 控制台中,输入 bt 以获取回溯。 - 0x8badf00d
8个回答

197
我猜这是一种在Xcode中很难追踪或重现的奇怪错误。我将问题缩小到IB中的一个特定UILabel上。只要我将它连接到一个IBOutlet UILabel *,就会出现此错误。
进一步调查发现,名称title导致了问题。我将标签声明为:
IBOutlet UILabel *title;

一旦我将名称更改为gtitle,所有东西都按预期工作了。谁知道呢?..


只是我的问题,使用标题。问题在于,我在另一个文件中也使用了标题,但一切都很好。 - Ratata Tata
这真的让我崩溃了...谢谢!回想起来,对于ivar来说绝对是个糟糕的选择,但它并不关键,所以我默认命名了它。Xcode的错误信息非常糟糕。 - MobileVet
14
“@Orlando Leite. 'title'这个名称会导致问题,因为您在一个'UIViewController'子类中。'UIViewController'类已经有一个名为'title'的成员变量。如果您有一个导航栏,您可以设置'title'字符串,它将出现在导航栏上。所以如果您把'title'当作标签来使用,您会收到错误提示,因为'title'实际上是一个'NSString'类型。” - George
我还需要将标题重命名为某个名称,并重新连接它以运行并再次连接。 - Renetik
我总是用缩写控制类型作为变量前缀。例如,tvNotes表示文本视图,lblName表示标签,这有助于避免任何混淆。 - GtotheB
@George:谢谢。否则,由于变量名称措辞问题而崩溃是一个巨大的错误,我们不应该忽视它,直到找出问题所在。 - clearlight

3
在我的情况下,是一个之前添加的IBOutlet连接到storyboard中视图中的项目。所以您可以仔细查看storyboard中的视图并查找所有连接,并确保它们没有出现问题。

1

Swift 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)
{

}

0

我遇到了类似的问题,但是通过这里提供的答案解决了。

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

我怀疑可能有一个叫做UIDateLabel的类,但是在UIDateLabel上进行谷歌搜索只显示了一些晦涩的结果(没有看到任何链接到苹果的),所以我暂时认为没有命名问题......直到我读到这里的答案并尝试了一下。

因此,我将名称替换为UIDateLabelAbc,一切都完美地工作了。将其重新命名为UIDateLabel不起作用,因为XCode告诉我已经有一个叫做那个名字的类。所以我进行了更多的谷歌搜索,并找到了一些维基页面,声称列出了UIKit.framework的继承层次结构,在那个列表中我发现了UIDateLabel。然而,这就是我能找到关于那个类的所有信息,即它存在。它的作用、目的等等对我来说仍然是未知的。

更新:阅读了命名约定之后,我现在意识到使用UI作为前缀不是一个好习惯(至少可以这样说)。因此,不要将您的类用UI作为前缀,您就可以避免这个问题,可能还有很多其他问题。


0
当我声明IBOutlet变量并将其命名为该视图控制器中的其他某些内容时,我会遇到此错误。因此,更合理地重命名我的变量和函数解决了这个问题。

0

昨晚我也遇到了这个问题,实际上我的标签确实命名为“title”(标题)。当我尝试将其更改为其他名称时,我有点焦头烂额,因为它并没有起作用。后来发现,我试图从一个文本字段向VC中的标签发送NIL值。我有4个VC,用户在第1个VC的文本字段中输入标题,然后将其存储到一个NSString类型的对象中。此字符串将放入VC 4中的标签中。当用户在VC 1中未输入标题时,这就是NIL值出现的地方。我通过在用户在VC 1中不输入标题时将字符串对象分配为默认值来解决了这个问题。希望这能帮助某些人。


0

试试这个:

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

尝试了这个 - self.view.backgroundColor = [UIColor clearColor] 结果出现完全相同的错误。 - Aleks G

0

这明显是一个“过度释放”问题。

在你的示例中很难确定原因(因为代码看起来绝对没问题),但是你正在对一个 UILabel 实例(而不是 UIColor)发送 copyWithZone 选择器,这肯定告诉我 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] 导致了完全相同的错误。 - Aleks G
相当奇怪,我已经编辑了我的答案,使其比简单的评论更清晰。 - apouche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接