2014-10-16 8 views
1

나는 우리가 alloc 초기화를 사용하여 메모리를 문자열에 할당하려고 시도 할 때 autorelease 풀에 추가 한 다음 해제하려고 시도 할 때 충돌을 일으키지 않습니다.autoreleased 문자열 개체 릴리스 크래시

NSString *value = [[[NSString alloc] initWithString:@"Hello"] autorelease]; 
[value release]; 

배열에 대해 동일한 작업을 수행하면 충돌이 발생합니다. 둘 다 NSObject에서 상속되므로 string과 array가 어떻게 다른지 알고 싶습니다.

+0

그냥 빠른 질문입니다. ARC를 사용하지 않는 이유가 있습니까? – Fogmeister

+0

이유는 없습니다. 그러나 나는 단지 b/w nsstring과 다른 객체의 차이를 명확하게 이해하려고 노력하고있다. –

답변

2

바로 충돌하지 않는 것을 의미합니까? 즉, release 행을 건너 뛴 후 디버거에서?

자동 해제 작업이 아직 완료되지 않도록 자동 복구 풀이 트리거되지 않습니다.

어느 쪽이든 - 항상 메모리 오류가있는 그들이 되어 있지 않을 가능성이 특정가 내장 된 충돌

  • 즉시, 컴퓨터/운영 체제
  • ,
  • ,
  • with 현재 빌드 설정,
  • ...
  • 또는 심지어 전혀.

그럼에도 불구하고 프로그래밍 오류입니다.

+0

절대로 충돌하지 않습니다. 배열을 초기화하고 같은 작업을 수행하면 release 문을 실행하자마자 충돌이 발생합니다. –

2

프로그램이 충돌한다는 보장은 없습니다. 불행하게도 충돌을 일으키지 않는 몇 가지 오류가 있습니다 (즉시).

그러나 문자열 리터럴에 대한 최적화가 있습니다. 그들은 창조되고, 유지되거나 석방되는 방식에 관계없이 영원히 산다. -initWithString:NSString의 새 인스턴스를 반환하지 않을 정도로 똑똑 할 수 있습니다.

0

먼저 정의되지 않은 동작은 입니다. 정의되지 않음 - 충돌하거나 다른 특정 작업을 수행하지 않을 수 있습니다. 과다 릴리스는 정의되지 않은 동작입니다.

둘째, 여기서 일어나는 일은 문자열 리터럴이 프로그램의 수명 동안 정적으로 할당 된 문자열 개체에 대한 포인터로 평가된다는 것입니다. 동적으로 할당되지 않으므로 메모리 관리의 대상이 아닙니다. retain, release 등은 아무런 영향을 미치지 않습니다. [[NSString alloc] initWithString:...] (마찬가지로 [... copy])은 새 객체를 만들 필요가 없으므로 불변 문자열 객체에 그대로 유지하고 그 인수를 직접 반환합니다. 따라서 [[NSString alloc] initWithString:@"Hello"]@"Hello"과 같습니다.