저는 아직도 svn 클라이언트 프로젝트를 계속하고 있습니다. Objective-C 개체 외부에 정적 C 언어 콜백 메서드가 있습니다. 그 중 char*를 NSString으로 변환했는데, 디버깅하는 동안 모든 것이 정상이었습니다. 그러나 나중에 실행하면 문자열 변수가 손실되며 이 속성을 제거하자마자 오류가 보고됩니다.
char*를 NSString으로 변환하는 코드:
으아악나중에 오류가 보고되는 곳(테이블뷰를 새로 고칠 때의 방법은 다음과 같습니다) :
으아악가장 이상한 점은 초기 변환 후 디버깅 중에 본 값과 유형이 나중에 오류가 보고되기 전에 본 것과 전혀 다르다는 것입니다. 다음은 변수 디버깅 시 두 개의 스크린샷입니다.
다음은 오류가 보고되기 전 디버깅 변수의 스크린샷입니다.
참고: 두 번째 요소의 이름 속성을 읽는 중에 오류가 발생했습니다. 이 기간 동안 나는 배열의 요소를 변경하지 않았으며 배열을 다른 위치에 복사했습니다. 유형과 값이 모두 변경되는 이유는 무엇입니까?
추가: 게다가, 속성 경로의 값이 손실된 것을 스크린샷에서 볼 수 있습니다. 메모리 주소의 문자열이 됩니다. * 기호를 사용한 다음 실제 값을 가져와야 합니까?
추가 2: 두 번째 스크린샷에서는 (NSString *) xxxxx로 표시되는데 이는 메모리 주소의 이름 속성과 같습니다. 시도해 보니 어떤 메소드를 호출하면 오류가 발생하고 무한 루프처럼 반복적으로 해당 위치에 중단점이 계속 들어가서 빠져 나오지 못했습니다. 이 오류를 우회할 수 있는 방법이 있나요?
srcEntry.name의 @property(매개변수 1, 매개변수 2) 속성의 매개변수는 무엇입니까?
다음과 같이 말씀하셨습니다. 이 기간 동안 배열의 요소를 변경하지 않았으며 배열을 다른 위치로 복사했습니다.
예: 다음은 시나리오 시뮬레이션입니다
으아악다음과 같이 두 개의 속성을 선언하는 경우:
및
정의 으아악아래 출력은 무엇입니까?
으아악결과는 다음과 같습니다. 문자열 2 = null
self.string1과 self.string2는 동일한 주소를 가리키고 string2는 메모리 주소를 유지하지 않으며 self.string1=nil은 메모리를 해제하므로 string1은 nil입니다. 약한 것으로 선언된 포인터의 경우 포인터가 가리키는 주소가 해제되면 이러한 포인터에는 nil 값이 할당됩니다.
이름 속성이 약하거나 복사로 변경하는 것이 가장 좋은 것 같습니다