2012-04-14 2 views
1

간단히 말해 다음 코드는 왜 실패해야하는지에 대해 당혹감을 갖습니다.NSStringWithFormat 크래시

// This line works 
NSString * string = [NSString stringWithFormat:@"%lu",[[NSDate date] timeIntervalSince1970]]; 

// This line works 
string = [NSString stringWithFormat:@"%@",@"somestring"]; 

// This line generates and EXEC_BAD_ACCESS error 
string = [NSString stringWithFormat:@"%lu%@",[[NSDate date] timeIntervalSince1970],@"somestring"]; 

왜?

답변

2

[[NSDate date] timeIntervalSince1970]에 의해 반환 된 값은 유형 NSTimeInterval이고 unsigned int입니다. @"%lu%@"@"%f%@"으로 바꾸면 문제가 없습니다.

+0

또는 int @ "% lu % @", (unsigned int) NSDate.date.timeIntervalSince1970'로 캐스팅 할 수 있습니다.이 주석은 완전성을위한 것일 뿐이지 만, 나는 대답을 말하는거야 :) – deanWombourne

+0

그 충돌을 일으키지 않을 것입니다, 그냥 내 의도에 대한 반환 날짜의 서명되지 않은 버전을 생성합니다. – YuzaKen

+0

@sch - 잘못된 형식 지정자를 전달하는 부작용으로 스택에 어떤 일이 일어나고 있는지 알지 못합니다. 두 경우 모두 작동하지 않는 것 같지만 손상은 메모리의 안전한 부분에서 수행됩니다 (1)하지만 메모리에 다음 (2) 경우에 사용하려고합니다. – deanWombourne