2010-06-05 33 views
1

當執行下面的代碼時,當代碼執行第二行代碼時,我收到運行時錯誤。該錯誤(顯示在調試器中)說:[NSButton initWithContentsOfURL:]:無法識別的選擇器發送到實例0x100418e10。我不明白這個消息,因爲它看起來像(根據我的源代碼)像initWithContentsOfURL消息發送到myImage實例(的CIImage類)...不是NSButton。任何想法是怎麼回事?來自CIImage的奇怪運行時錯誤消息initWithContentsOfURL

如果重要...此代碼位於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"); 
} 

回答

1

此行

if (myImage = Nil) {... 

難道不是比較分配

另外,不要把一個空間參數之前,你的方法有問題。它應該是這樣的:

CIImage *myImage = [[CIImage alloc] initWithContentsOfURL:myURL]; 
+0

當你說「不要在你的方法的參數之前放一個空格」,你是指initWithContentsOfURL:和myURL之間的空格嗎?這只是格式化口味的問題。除此之外,你的回答是正確的。 – JWWalker 2010-06-05 22:16:38

+0

增加的分區爲我解決了這個問題(儘管我仍然覺得很奇怪,提到的錯誤消息提到了NSButton)。而我的等號就是一個Doh!我的時刻。我相信它也會在這個聲明上被轟炸......如果它真的那麼做的話。所以謝謝你指出這兩件事! – Adam 2010-06-06 00:26:14

+1

另外(這是迂腐),'Nil'用於類,'nil'用於其他對象(你應該在那裏使用'nil')。 – Wevah 2010-06-06 17:54:09

0
CIImage *myImage = [myImage initWithContentsOfURL: myURL]; 

您還沒有初始化myImage變量,但您發送它的價值initWithContentsOfURL:消息。偶然的時候,它包含指向現有對象的指針(比如現有的NSButton對象),就會出現問題中的異常。

如果你真的不走運,你最終將消息發送到對象將迴應initWithContentsOfURL:,在這種情況下,這將有不同的URL重新初始化該對象。根據URL,它可能會使對象有錯誤的內容,或釋放自己。無論哪種方式,它可能會導致多次泄漏,並且會導致崩潰,或者通過將後來的CIImage消息發送到仍然不是CIImage的對象(簡單地是重新初始化的其他對象),或者通過向釋放的對象發送消息本身,所以現在已經死了。

正如Eimantas所述,解決方案是分配一個新的CIImage對象(通過發送CIImage類消息),然後將initWithContentsOfURL:消息發送到該對象,然後將該結果分配給該變量。

if (myImage = Nil) { 

如Eimantas指出的,這是一個賦值,不進行比較。是的,在C中的條件內分配一個變量是完全有效的(在Objective-C中也是如此)。編譯器爲此提供警告;你應該打開it and a bunch of others。解決方案是使用相等運算符==

此外,Wevah指出,Nil是在這裏使用的錯誤常量,因爲您正在比較對象的指針而不是類的指針。正確的常量是nil