2010-06-05 5 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) {... 

대신 비교의 할당을합니까이 줄은 메서드에 대한 매개 변수 앞에 공백을 넣지 마십시오,이 문제의. 그리고는 다음과 같이해야한다 : 당신은 myImage 변수를 초기화하지 않은

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

"문제의 매개 변수 앞에 매개 변수를 넣지 마십시오"라고 말하면 initWithContentsOfURL :과 myURL 사이의 공백을 나타 냅니까? 그것은 단지 형식화의 문제 일뿐입니다. 그 외에는 답이 맞습니다. – JWWalker

+0

alloc의 추가로 인해 문제가 해결되었습니다 (NSButton에 대한 오류 메시지가 NSButton을 언급 한 것이 이상하다고 생각합니다).그리고 나의 단 하나의 등호는 확실히 Doh! 나를위한 순간. 나는 그것이 그 진술에 폭격을 가했을 것이라고 확신한다. 그래서 두 가지를 지적 해 주셔서 감사합니다! – Adam

+1

또한 (과 pedantic),'Nil'은 클래스를위한 것이고,'nil'은 다른 객체를위한 것입니다 (여러분은 거기에'nil'을 사용해야합니다). – Wevah

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

,하지만 당신은 그 값 initWithContentsOfURL: 메시지를 보내고있다. 우연히 기존 개체 (예 : 기존 NSButton 개체)에 대한 포인터가 포함되어있을 때 질문에 예외가 발생합니다. 당신은 정말 운이 경우

, 당신은 에 메시지를 보내는 결국 객체이 다른 URL로이 개체를 다시 초기화되는 경우, initWithContentsOfURL:에 응답합니다. URL에 따라 개체의 내용이 잘못되거나 자체가 해제 될 수 있습니다. 어느 쪽이든, 그것은 아마도 여러 가지 누출을 일으킬 것이고, 나중에 CIImage 메시지를 CIImage가 아닌 객체 (간단히 다시 초기화 된 다른 객체)로 보내거나, 해제 된 객체에 메시지를 보내서 충돌을 일으킬 것입니다 그 자체는 이제 죽었습니다.

해결책은 Eimantas에서 설명한대로 CIImage 클래스에 alloc 메시지를 보내어 새로운 CIImage 개체를 할당 한 다음 initWithContentsOfURL: 메시지를 해당 개체에 보내고 해당 결과를 변수에 할당합니다.

if (myImage = Nil) { 

Eimantas가 ​​

바와 같이,이 할당하지 비교된다. 그렇습니다. C에서 조건 내의 변수에 대입하는 것은 완벽합니다 (Objective-C에서도 마찬가지입니다). 컴파일러는이를 경고합니다. it and a bunch of others을 켜야합니다. 해결 방법은 동등 연산자 인 ==을 사용하는 것입니다.

Wevah가 언급했듯이 Nil은 클래스의 포인터가 아니라 객체의 포인터와 비교하기 때문에 여기에서 사용하는 것은 상수입니다. 올바른 상수는 nil입니다.