2013-05-25 2 views

답변

3

문제는 newTitletitle이 모두 포인터이며 포인터가 동일한 메모리 위치를 가리킬 수 있다는 것입니다. 당신이 임시 변수를 제거하고 훨씬 간단하게 보이는됩니다

static CFStringRef title = NULL; 
void SetTitle(CFStringRef newTitle) { 
    CFRelease(title); 
    title = CFStringCreateCopy(kCFAllocatorDefault, newTitle); 
} 

로이 있다면

그래서 상상한다. 그게 다 잘되고 잘됐다.

하지만 다음이

SetTitle(title); 

을 한 경우는 함수에 들어갈 때, 모두 newTitletitle는 같은 주소를 가리키는 것! 따라서 함수의 첫 번째 줄은 title; 그러나 이것도 동시에 newTitle을 발표하고 있습니다 (그것들은 동일하기 때문에!).

그래서 함수의 두 번째 줄에 도달 할 때까지 newTitle이 사라진 메모리가 사라졌습니다. 아마 그것은 제로가되었습니다. 어쩌면 그것은 처음 몇 장을 지키는 데 사용되고 있습니다 전쟁과 평화. 우리는 알지 못하지만,이 함수가 더 이상 newTitle이 될 것으로 기대했던 것이고 더 이상 쓰레기 메모리라는 것을 분명히 알지 못합니다.

그래서 함수의 두 번째 줄은 가비지 메모리 복사본을 만들려고 시도합니다. 매우 운이 좋으면 앱이 다운됩니다. 그러나 이것이 궁극적으로 궁극적으로 정의되지 않은 행동을 초래할 것이라고 확신합니다. 컴퓨터가 화재로 인해 "God Save The Queen"노래를 부른다면, 당신은 스스로를 비난해야합니다. 애플의 버전에서

, 그것은 임시 변수에 원래 title을 따로 설정 복사본을 생성하고 다음 원래 title 무엇 해제합니다. 복사본이 가비지 데이터로 처리되지 않고 컴퓨터가 더러워지지 않기 때문에 괜찮습니다.

Win-win.

+2

재미 있고 재미있는 설명에 감사드립니다. 내 이해는 CFRelease가 autorelease와 같은 제거 대상을 표시하는 것일뿐입니다. 하지만 이제는 일단 'CFRelease'를 호출하면 객체가 유효하다고 생각해서는 안된다는 것을 알았습니다. – Pablo