2012-02-25 4 views
5

이 난을 가지고 있던 iOS 앱을 개발했다. 내가 보관하고 테스트 용으로 배치하기 위해 TestFlight에 보내면 알 수없는 신호 오류가 크래시 로그에 표시됩니다.NSError * 오류; vs NSError * error = nil; 대신</p> <pre><code>NSError *error; </code></pre> <p>:</p> <pre><code>NSError *error = nil; </code></pre> <p>그것은 내가 연결되어있는 동안 장치의 시뮬레이터 및 디버깅 디버깅 동안에서 잘 작동

왜 이런 일이 발생합니까?

답변

7

초기화되지 않은 포인터가 있기 때문에 이런 현상이 발생합니다. 운이 좋다면 충돌이 발생하지 않지만 그러한 포인터는 undefined behavior입니다. dasblinkenlights에 명확히하기 위해

+0

@ daSn0wie 의심스러운 경우 초기화되지 않은 변수의 주소를 선언 한 직후에 기록하십시오. 'NSLog (@ "오류 : % p", 오류); ' – bneely

3

대답이 변수 선언한다 :

NSError *error; 

을 ... 그리고 당신이 그것을 첫 번째 방법을 사용하려고하면이 선언과 변수

NSError *error = nil; 

을 할당한다 아무 것도 설정하지 않고 액세스하려면 "가리키는"값을 "가비지 (garbage)"라고합니다. 다른 메모리 스택에 대한 포인터이며, 액세스하면 거의 항상 앱이 다운됩니다. 따라서 위와 같이 또는 직후에 변수에 값을 할당하는 것이 좋습니다.

+1

오류가 없다면 일반적으로 오류 상태를 반환하는 방법으로'NSError' var에 액세스해서는 안됩니다. 오류가없는 경우 API는 오류 var의 값을 보증하지 않습니다. var가 nil로 설정되고 오류로 인해 호출에 의해 변경 되었기 때문에 신뢰할 수 없습니다. 그래서 이것을 0으로 설정하면 아무런 해가되지도 좋지도 않습니다. – zaph

+0

정말 그가 사용하는 API에 달려 있습니다. – coneybeare

+1

애플 문서에서'NSError' : "일반적으로 메소드는 오류 객체의 단순한 존재가 아닌 NO 또는 nil을 반환하는 등의 오류 조건을 신호해야합니다." 반환 된 에러 코드에 의존하는 것은 항상 안전 할 것이고,'NSError' 객체에 의존하는 것은 안전 할 수도 안될 수도 있습니다. 그것은 선택입니다. – zaph