2009-05-31 4 views
3
내 콘솔에 오류가 점점 오전

:"isEqualToString"코코아 오류

2009년 5월 30일 20 : 17 : 05.801 ChuckFacts [1029 : 20B] *** - [농담 isEqualToString :]를 : 알 수없는

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Joke"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil]; 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
            reuseIdentifier:CellIdentifier] autorelease]; 
    cell = tableCell; 
} 

NSString *jokeText = [jokes objectAtIndex:indexPath.row]; 
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; 
jokeTextLabel.text = jokeText; 
NSString *dateText = formattedDateString; 
UILabel *dateTextLabel = (UILabel*) [cell viewWithTag:2]; 
dateTextLabel.text = dateText; 
[self todaysDate]; 
return cell; 
} 

"농담"전체 배열입니다 : 선택은 여기

0x52e2f0 내가 오류에서 오는 생각 내 코드 인스턴스로 전송 농담, 당신이 알 필요가있는 경우 넣으십시오

왜 그 오류가 들어 오나요?

내가 "0x52e2f0는"을 쉽게 찾을 수있을 것입니다 그래서 무엇인지 확인하는 방법을 예를 0x52e2f0

로 전송 : 또한

, 당신은 말한다 오류 부분을 참조 할 다음 번에 문제가 생길까요?

+0

정확한 복제본 : http://stackoverflow.com/questions/865527/cocoa-i-have-an-error-and-after-reading-and-trying-to-figure-it-out-i-cant –

답변

18

왜 오류가 발생합니까?

isEqualToString:을 Joke 객체에 보내고 Joke 객체가 isEqualToString:에 응답하지 않기 때문에.

당신은 의도적으로 그 메시지를 Joke 객체에 보내지 않을 것입니다. 대신 Joke 객체를 NSString 객체를 기대하는 것으로 전달하거나 리턴한다.

jokes은 "농담이 가득한 배열"이라고 말하면됩니다.그러나 코드에서, 당신은이 작업을 수행 :

NSString *jokeText = [jokes objectAtIndex:indexPath.row]; 
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; 
jokeTextLabel.text = jokeText; 

예외로 가고, 나는 "농담의 전체 배열"에 의해, 당신은 "농담 객체의 배열을"의미 같은데요.

NSString * 변수에 Joke 객체를 넣으면 Joke 객체가 NSString으로 변환되지 않습니다. 컴파일러에게 변수에 NSString이 들어 있다는 것을 말하면서 그 대신에 Joke를 넣는 것뿐입니다. 나는 이것을 "컴파일러에게 거짓말"이라고 부른다. 당신에게 경고를주고 당신이이 일을 후 즉시 컴파일하면

Joke *joke = [jokes objectAtIndex:indexPath.row]; 

, 당신은 컴파일러가 시작되었음을 알 수 있습니다 :

이 문제를 해결하는 첫 번째 단계는 거짓말을 제거하고 그 자리에 진실을 복원하는 것입니다 이후 라인의 몇 :

jokeTextLabel.text = jokeText; 

경고 :의 인수 하나를 전달 '의 setText :'뚜렷한 목표 - C 형

물론 맞습니다. 농담은 여전히 ​​NSString이 아닙니다. 변수의 타입에 대해 솔직 해졌을 때, 컴파일러는 이것을 잡아낼 수 있습니다. 당신은 텍스트의 농담 개체를 요청할 때

실제 수정

(나는 그것이 이것에 대한 속성이 있다고 가정하고, 해당 속성의 값이있는 NSString 있음) 및 을 제공 오는 그 jokeTextLabel.text 세터로.

"0x52e2f0"이 무엇인지 판단하여 다음 번에 문제를 쉽게 찾을 수 있습니까?

Xcode의 중단 점 창에서 objc_exception_throw에 중단 점을 설정하십시오. 그런 다음 프로그램을 실행하십시오. 예외가 발생하면 디버거가 프로그램을 중지하고 디버거 창이 열립니다. 그런 다음 po 0x52e2f0을 디버거 콘솔에 입력하십시오. (po은 "인쇄물"을 의미합니다.)

이것은 Mac 응용 프로그램에서 작동합니다. iPhone 앱에서도 작동 할 것이라고 가정합니다.

+0

또 다른 훌륭한 대답입니다, 피터. – Abizern

2

"농담으로 가득 찬 배열"로, 분명히 "농담 유형의 수업으로 가득 찬 배열"을 의미합니다. Joke 객체는 UILabel의 text 속성에 할당 할 수 없습니다. NSString 만 필요합니다.

(코코아 어떤 객체가 어떤 .toString() 방법을 통해 자동으로 문자열로 강제 할 수 Java 또는 C++처럼되지 않습니다. 일반적으로 프레임 워크가 NSString의이 문자열을 원하는 명시 적으로 때를 요청합니다.)

여기 있는거야 벌어지고 : text 속성에 Joke 개체를 할당하려고합니다. Cocoa는 NSString (암시 적으로 id 유형은 할당하려는 모든 유형이 될 것임)으로 암묵적으로 이해되므로이 경우 경고없이조차도 이와 같은 유형으로 빠르고 느슨하게 재생할 수 있습니다. 그러나 Joke 객체에서 isEqualToString: (NSString 메서드)를 호출하려고 시도하면 물론 실패합니다.

대신 농담의 텍스트를 레이블에 지정해야합니다.

개체를 식별하는 방법 : 디버거에서 po 0x52e2f0 명령을 실행할 수 있습니다.이 명령은 일반적으로 메모리가 완전히 보크가 아닌 경우에 작동합니다. 해당 주소에있는 오브젝트의 Objective-C 표현을 인쇄합니다.

+1

사실,이 경우에는 (관련) 유형 변환이 없습니다. NSArray 메시지 objectAtIndex : 'id'를 반환합니다.이 유형은 경고없이 포인터 유형에 적합합니다. –

+0

실제로 당신 말이 맞습니다. 수정 됨. –

+0

-description 메서드를 사용하면 실제로 모든 객체의 문자열 표현을 얻을 수 있습니다. 기본 구현에서는 와 같은 것을 리턴 할 것이다. –