来自CIImage initWithContentsOfURL的奇怪的运行时错误消息

时间:2010-06-05 21:52:31

标签: objective-c cocoa

执行以下代码时,代码执行第二行代码时会收到运行时错误。错误(显示在调试器中)说:[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");
}

2 个答案:

答案 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