执行以下代码时,代码执行第二行代码时会收到运行时错误。错误(显示在调试器中)说:[NSButton initWithContentsOfURL:]:无法识别的选择器发送到实例0x100418e10。我不明白这个消息,因为它看起来像我(基于我的源代码),就像initWithContentsOfURL消息被发送到myImage实例(CIImage类)...而不是NSButton。知道发生了什么事吗?
如果重要...此代码位于Xcode项目的应用程序控制器类模块(Cocoa应用程序)中 - 在我单击应用程序窗口上的按钮时调用的方法中。窗户上只有一个按钮......
// Step1: Load the JPG file into CIImage
NSURL *myURL = [NSURL fileURLWithPath:@"/Users/Adam/Documents/Images/image7.jpg"];
CIImage *myImage = [myImage initWithContentsOfURL: myURL];
if (myImage = Nil) {
NSLog(@"Creating myImage failed");
return;
}
else {
NSLog(@"Created myImage successfully");
}
答案 0 :(得分:1)
这一行
if (myImage = Nil) {...
分配而不是比较
另外,不要在参数之前为您的方法添加空格。它应该是这样的:
CIImage *myImage = [[CIImage alloc] initWithContentsOfURL:myURL];
答案 1 :(得分:0)
CIImage *myImage = [myImage initWithContentsOfURL: myURL];
您尚未初始化myImage
变量,但您发送的值为initWithContentsOfURL:
消息。当它偶然包含指向现有对象(例如现有NSButton对象)的指针时,会出现问题中的异常。
如果你真的不走运,你最终将消息发送到的对象将响应initWithContentsOfURL:
,在这种情况下,这将使用不同的URL重新初始化此对象。根据URL,它可能使对象具有错误的内容,或释放自身。无论哪种方式,它可能会导致多次泄漏,并且会导致崩溃,或者通过将后面的CIImage消息发送到仍然不是CIImage的对象(只是重新初始化的其他对象),或者通过向发布的对象发送消息本身,现在已经死了。
正如Eimantas所述,解决方案是分配一个新的CIImage对象(通过向CIImage类发送alloc
消息),然后将initWithContentsOfURL:
消息发送到该对象,然后将该结果分配给变量。
if (myImage = Nil) {
正如Eimantas所说,这是一项任务,而非比较。是的,在C中的条件中分配变量是完全有效的(在Objective-C中也是如此)。编译器为此提供警告;你应该打开it and a bunch of others。解决方案是使用等于运算符==
。
此外,正如Wevah所说,Nil
是在这里使用的错误常量,因为你正在比较一个对象的指针,而不是一个类的指针。正确的常量是nil
。