목표 C-할당, 복사, 유지


83

저는 Objective C를 처음 사용합니다. 포인터 개념을 포함하여 C에 대한 기본 지식이 있습니다. 두 가지 기본적인 질문이 있습니다.

  1. 누군가가 할당, 복사 및 유지의 차이점을 비유로 설명 할 수 있습니까?
  2. 포인터 변수를 반환하는 함수를 어떻게 처리하고 반환 포인터를 통해 메시징을 수행합니까?

답변:


126

변경된 문서에 대한 업데이트 된 답변

정보는 이제 문서의 여러 가이드에 분산되어 있습니다. 다음은 필수 읽기 목록입니다.

이제이 질문에 대한 답은 전적으로 ARC 관리 애플리케이션 (새 프로젝트의 최신 기본값)을 사용하는지 아니면 수동 메모리 관리를 강제하는지에 따라 달라집니다.

Assign vs. Weak- 객체를 유지하거나 큐레이팅하지 않고 속성의 포인터를 객체의 주소로 설정 하려면 assign 을 사용 합니다 . 할당 된 객체가 할당 해제 된 경우 속성이 자동으로 nil을 가리 키도록 하려면 weak 를 사용하십시오 . 대부분의 경우 weak 를 사용하기를 원할 것이므로 EXC_BAD_ACCESS적절한 정리를 수행하지 않으면 할당 해제 된 객체 (메모리 주소의 불법 액세스- " ") 에 액세스하려고 하지 않습니다.

Retain vs. Copy- 선언 된 속성 은 기본적으로 유지 를 사용 하고 (따라서 간단히 모두 생략 할 수 있음) 다른 개체가 속성에 할당되거나 nil로 설정되어 있는지 여부에 관계없이 개체의 참조 횟수를 자동으로 관리합니다. copy 를 사용 하여 새로 할당 된 객체에 자동으로 -copy메시지를 보냅니다 (전달 된 객체의 사본을 생성하고 대신 속성에 해당 사본을 할당합니다. 할당 된 객체가 다음과 같이 설정된 후 수정 될 수있는 일부 상황에서 유용 (필수)) 다른 객체의 속성 (수정 / 변형이 속성에도 적용됨을 의미 함)


2
감사합니다 친구 저는 현재 개발중인 Apple Dev의 기본 사항을 읽었습니다. 메모리 관리에 어려움을 겪고 "objc_msgSend ()에서 충돌했습니다."그래서 속성에 대한 이해를 수정하려고 생각했습니다. stackoverflow.com/questions/4506205/…
Sabha B

2
참고로, 답변에 대한 링크는 사과 사이트의 일반적인 "페이지를 찾을 수 없음"으로 이동합니다. 그런 다음 "Mac 개발자 라이브러리"로 리디렉션됩니다.이 SO 답변에는 유용한 정보가 있습니다. stackoverflow.com/questions/2255861/…
hippeelee

1
문서가 변경되어 더 이상 편리한 장소에 있지 않기 때문에 업데이트하기 어려운 종류입니다. Apple 문서 팀에 피드백을 보냈습니다.
Joshua Nozzi

33

iOS 참조 라이브러리 의 메모리 관리 프로그래밍 가이드 에는 유추 및 예제와 함께 할당, 복사 및 유지의 기본 사항이 있습니다.

copy 개체의 복사본을 만들고 보유 개수 1로 반환합니다. 개체를 복사하면 복사본을 소유하게됩니다. 이는 "copy"가 반환되는 객체를 나타내는 copy라는 단어를 포함하는 모든 메서드에 적용됩니다.

보유 오브젝트의 보유 수를 1만큼 증가시킵니다. 오브젝트의 소유권을 가져옵니다.

release 개체의 보유 횟수를 1만큼 줄입니다. 개체의 소유권을 포기합니다.


답장을 보내 주셔서 감사합니다. 1. ClassA에 (Class B *) functionName이라는 속성이 있습니다. 2.ClassB는 메소드를 가지고 – (void) setHeight; 3. ClassC 인터페이스 ClassA * tempA를 보유로 선언했습니다. 4. 생성자에서 클래스 C 구현이 문이 있습니다. ClassB * tempB = tempA.functionName; 5. tempB 초기화의 다음 줄에 메시지 (tempB. setHeight;)를 보내려고하면 내 프로그램이 제대로 작동합니다.
Sabha B

6. 동일한 명령문 (tempB. setHeight;)을 일부 함수에 넣고 동일한 함수를 호출하면 내 프로그램이 objc_msgSend ()에서 충돌이 발생합니다.
Sabha B

8
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)

2
주변의 설명은 당신의 대답을 심각하게 향상시킬 것입니다.
zx485

4
  1. 양수인

    • 할당은 기본 속성 속성입니다.
    • assign 속성 속성은 속성의 setter 구현을 합성하는 방법을 컴파일러에 알려줍니다.
  2. 부:

    • 객체가 변경 가능한 경우 복사가 필요합니다.
    • copy는 가비지 수집이 아닌 환경에서 명시 적으로 해제 (예 : dealloc)해야하는 객체를 반환합니다.
    • 복사본을 유지하고 있으므로 작업이 끝나면 개체를 해제해야합니다.
  3. 유지 :

    • 할당시 새 값이 "-retain"으로 전송되고 이전 값이 "-release"로 전송되어야 함을 지정합니다.
    • 유지하면 자동으로 강력하게 작동합니다.
    • "alloc"과 같은 메서드에는 암시 적 "유지"가 포함됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.