2011-12-12 5 views
1

나는 바보 같은 질문을 사이의 차이에 대한 다른 일 (dumb question)를 물었다. 이것은 쉽게 여전히 바보 같은 질문이 될 수초기화 객체/ARC

// line1 -- added retain 
NSMutableData* myData = [[NSMutableData data] retain]; // added retain 
// line2 
NSMutableData* myData = [[NSMutableData alloc] init]; 

... 사과 그런 경우 인 경우 : 내가 물어 의미하는 것은 차이 것입니다! 진짜 차이점이 있습니까? ARC와? NSXMLParser 예제에서 두 가지 방법을 사용하는 것을 보았습니다. (일부 Apple 예제에서는 [[[NSMutableData alloc] init] autorelease]를 사용합니다.) 실제로 차이가 있는지 확실하지 않습니다.

+1

컴파일러는 ARC에서 'release'를 사용할 수 없습니다. – dasblinkenlight

+0

[\ [NSDate 날짜 \] 보유 \]와 \ [\ [NSDate 할당 \] 초기화 \] 간의 차이] (http://stackoverflow.com/questions/7102706/difference-between-nsdate-date) -retain-and-nsdate-alloc-init) –

+1

@JoshCaswell : ARC는 그 당시 존재하지 않았으며,이 질문자는 ARC의 차이점에 대해 구체적으로 묻습니다. 그 대답을 변경 : ARC에서 차이점은 하나가 유효하지 않다는 것입니다. –

답변

7

retain은 ARC 컴파일 코드에서 호출 할 수 없습니다.

질문에 대답하려면 비 ARC 환경에서 이러한 질문은 사실상 동일합니다.

[NSMutableData data]은 자동 회수 된 객체를 반환합니다.이 객체에 retain을 호출하면 소유권을 얻게되며 어느 시점에서 해제 할 책임이 있습니다.

[[NSMutableData alloc] init]은 보유 개수가 1 인 객체를 반환하므로 사용자는 소유자이며 작업을 완료 할 때 해제해야합니다.

다시 말해서 retain은 ARC 컴파일 된 코드에서 사용할 수 없으므로 NSMutableData* myData = [[NSMutableData data] retain];은 컴파일되지 않습니다.

그리고 ARC를 사용하는 경우 다음 줄 중 하나를 사용하여 안전 할 수 있으므로 개체가 유지되거나 해제되는 방법에 대해 걱정할 필요가 없습니다.

// line1 
NSMutableData* myData = [NSMutableData data]; 
// line2 
NSMutableData* myData = [[NSMutableData alloc] init]; 

편집

는 또한, [[[NSMutableData data] retain] autorelease]이 코드는 오히려 무의미 과도한이다. 그것이 말하는 것은 "나에게 자동 출시 된 NSMutableData 객체를 클래스 메소드 data을 사용하여주고,이 자동 해제 된 객체를 유지하고 자동 소유 풀에 다시 소유하고있는 객체를 추가하는 것입니다." 따라서 기본적으로 [NSMutableData data]은 적은 코드와 적은 오버 헤드에서 동일한 결과를 얻습니다. 애플의 사례에서 이와 같은 라인을 실제로 본다면 놀랄 것입니다.

+0

죄송합니다, 당신이 틀렸어, 내가 잘못된 코드를 붙여 넣었습니다. Apple 예제는 적절한 alloc-init-autorelease ... 데이터 보유가 아닙니다. 내 질문을 업데이트 할게. – Raolin

+0

Chris가 맞습니다. 또한 [NSMutableData new]도 사용할 수 있습니다 [[NSMutableData alloc] init]과 동일합니다. – NadavN7