2011-10-28 3 views
15

그것은 간단한 질문 일 수 있지만 내 수업에 NSCopying 프로토콜을 구현하는 이유는, 나는 이것은 객체 복사 배열이 방법을 사용하여 호출 전무NSCopying을 구현하는 동안 zone이 항상 nil 인 이유는 무엇입니까?

- (id)copyWithZone:(NSZone *)zone 
{ 
    if (zone == nil) 
     NSLog(@"why this is allways nil"); 

    (...) 
} 

영역 ==를 얻을.

[[NSArray alloc] initWithArray:myArray copyItems:YES]]; 

답변

25

케빈의 documentation를 참조 로빈의 대답이 가장 정확합니다. 오스카의 대답은 정확하기에 가깝습니다. 그러나 Gnustep 문서 나 logancautrell이 존이 존재하는 이유는 정확하지 않습니다.

존은 처음에 만들어졌습니다. 첫 번째 NXZone, 다음 NSZone은 단일 구역에서 할당 된 객체가 메모리에서 상대적으로 인접 해 있다는 것을 보장합니다. 결과적으로 앱이 사용하는 메모리 양은 줄어들지 않습니다. 대부분의 경우 약간 증가하게됩니다.

큰 목적은 일련의 대상을 대량으로 파괴 할 수있게하는 것이 었습니다.

예를 들어, 복잡한 문서를 문서 기반 응용 프로그램에로드하는 경우 문서가 닫힐 때 개체 그래프를 분해하는 것은 실제로 상당히 비쌀 수 있습니다. 문서에 대한 모든 오브젝트는 하나의 영역 에서 할당 된 경우

따라서, 그 영역의 할당 메타 데이터는 그 영역에서도 한 후, 문서에 관련된 모든 오브젝트의 파괴로 싼 것 간단히 영역을 파괴하는 것입니다. (정말 싸구려 - "여기, 시스템,이 페이지들을 다시 가지고 있습니다"- 하나의 함수 호출).

이렇게되면 작동하지 않습니다. 영역에있는 객체에 대한 단일 참조가 영역 밖으로 유출 된 경우 문서가 닫히 자마자 응용 프로그램이 BOOM이되고 객체가 참조하는 내용이 무엇인지 알릴 방법이 없습니다. 둘째,이 모델은 GC 시스템에서 자주 발생하는 "희소 자원"문제에 대한 피해를 입었습니다. 즉, 문서의 객체 그래프가 메모리가 아닌 리소스에 보관되면 영역 삭제 전에 효율적으로 해당 리소스를 정리할 방법이 없습니다.

결국 취약성이 추가 된 거의 모든 성능 상실 (복잡한 문서를 얼마나 자주 닫는 지)의 조합은 영역을 좋지 않게 만듭니다. API를 변경하기에는 너무 늦었고, 우리는 흔적을 남겼습니다.

+0

신난다. 나는 당신이 대답 할 것이기를 바랬다. 참고로,이 문서는 언제든지 Apple 문서에 기록되어 있습니까? 오늘 찾을 수있는 것은 NSZone * 기초 방법입니다. – logancautrell

+3

내 관심을 불러 일으키고 싶은 질문이 있으면 Twitter에서 나에게 묻어주세요. 언어 (및 OS)의 진화는 정말 매력적입니다. 그것이 문서화 되었다면, 아마도 랩소디 시대 동안 남은 것이었을 것입니다. 존이 적절한 맥 오에스텐 릴리스에서 추천 된 적이 없다고 생각한다. – bbum

+1

귀하의 게시물은 귀하의 고유 한 지위와 경력으로 인해 매우 중요하다고 생각합니다. 더 많은 Apple 엔지니어들이 여기서 시간을 보냈 으면 좋겠습니다. – logancautrell

1

존은 컴퓨터의 RAM이 8 메가 이하인 구식의 유산입니다.

확인이을 (3.1.2 메모리 할당 및 영역) : 코코아 빌더에 대한이의 좋은 토론을 통해 (잘은 코코아 dev에 메일 링리스트에 있던)에서도

http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_3.html

있다 약 10 년 전. 이것은 바로 @bbum이 말한 내용입니다.

http://www.cocoabuilder.com/archive/cocoa/65056-what-an-nszone.html

은 분명히이 애플 문서에 설명하는 데 사용하지만, 2007-06-06 이후 어느 시점에서 변경되었습니다. 꽤 오래 때문에

http://www.cocoadev.com/index.pl?NSZone

1

NSZone는 목적이 가상 메모리 페이지의 동일한 세트를 사용하여 힙에 객체를 할당하는 것이 었습니다, 지금은 문서화되지 않은 클래스입니다. 그러나 대부분은 더 이상 사용되지 않지만 이전에 사용 되었기 때문에 매개 변수는 이전 버전과의 호환성을 위해 여전히 사용됩니다.

3

NSZone은 오래 전에 사용되지 않았습니다. 메소드 서명 (예 : +allocWithZone:-copyWithZone:)에 여전히 남아 있다는 사실은 이전 버전과의 호환성을위한 것입니다.

+1

copyWithZone이 더 이상 사용되지 않는 경우 (NSCopying 프로토콜 정의에 언급되지 않은 항목), 요즘의 copyWithZone과 함께 NSCopying을 구현하는 방법은 요? – Marcin

+3

'-copyWithZone :'은 더 이상 사용되지 않습니다. 'NSZone'입니다. 영역 인수를 무시하십시오. –

4

NULL 영역은 '기본 영역 사용'을 의미합니다. 영역은 현대 Objective C 런타임에서 더 이상 사용되지 않으며 ARC와 함께 사용할 수 없습니다.