your programing

Objective C에서 객체 할당 및 초기화

lovepro 2020. 12. 29. 08:06
반응형

Objective C에서 객체 할당 및 초기화


객체를 할당하고 초기화하는 다음 두 가지 방법의 차이점은 무엇입니까?

AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];

self.aController= [[AController alloc] init];

대부분의 사과 예제는 첫 번째 방법을 사용합니다. 할당, 초기화 및 객체 처리 후 즉시 해제하는 이유는 무엇입니까?


모든 개체에는 참조 횟수가 있습니다. 0이되면 객체가 할당 해제됩니다.

속성이 다음과 같이 선언되었다고 가정합니다 @property (retain).

첫 번째 예, 한 줄씩 :

  1. 객체는에 의해 생성되었으며 alloc참조 횟수는 1입니다.
  2. 객체는 selfsetAController:메소드 로 넘겨지고 , retain메시지 를 전송합니다 (메서드가 객체가 어디에서 오는지 알 수 없기 때문에), 참조 횟수를 2로 증가시킵니다.
  3. 호출 코드는 더 이상 객체 자체가 필요하지 release않으므로을 호출 하여 참조 횟수를 1로 줄입니다.

두 번째 예제는 기본적으로 1 단계와 2 단계를 수행하지만 3 단계는 수행하지 않으므로 마지막에 객체의 참조 횟수는 2입니다.

규칙은 객체를 생성하는 경우 작업이 완료되면 해제해야한다는 것입니다. 귀하의 예제에서 코드는 속성을 설정 한 후 tempAController로 수행됩니다. retain객체가 주변에 붙어 있어야 할 경우 호출 하는 것은 setter 메서드의 책임 입니다.

그것은 기억하는 것이 중요 self.property = foo;오브젝티브 C에 대한 단지 속기 정말 [self setProperty:foo];하고 있다는 setProperty:방법은 유지 또는 필요에 따라 개체를 복사 할 것입니다.

속성이 선언 된 @property (copy)경우 객체는 유지되는 대신 복사되었을 것입니다. 첫 번째 예에서는 원래 개체가 즉시 해제됩니다. 두 번째 예제에서 원래 객체의 참조 횟수는 0이어야하지만 1이됩니다. 따라서 동일한 방식으로 코드를 작성하고 싶을 것입니다.

속성이 선언 된 경우 @property (assign), 다음 self개체의 소유권을 주장하지 않고, 다른 사람의 필요 그것을 유지. 이 경우 첫 번째 예는 올바르지 않습니다. 이러한 종류의 속성은 드물며 일반적으로 개체 대리자에만 사용됩니다.


다른 사람들이 언급했듯이 표시되는 두 코드 조각은 동일하지 않습니다 (메모리 관리상의 이유로). 전자가 후자보다 선택되는 이유에 대해 :

후자의 올바른 공식은 다음과 같습니다.

self.aController= [[[AController alloc] init] autorelease];

전자와 비교할 때 이것은 자동 해제 풀을 사용하여 추가 오버 헤드를 추가하며 일부 상황에서는 객체의 수명이 불필요하게 연장되어 (자동 해제 풀이 해제 될 때까지) 응용 프로그램의 메모리 공간이 증가합니다.

다른 "가능한"구현 (예제 출처에 따라 다름)은 다음과 같습니다.

aController = [[AController alloc] init];

그러나 인스턴스 변수를 직접 설정하는 것은 init 또는 dealloc 메서드가 아닌 다른 곳에서는 권장되지 않습니다. 다른 곳에서는 항상 접근 자 메서드를 사용해야합니다.

그러면 샘플 코드에 표시된 구현으로 이동합니다.

AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];

이는 다음과 같은 모범 사례를 따릅니다.

  • 자동 해제를 방지합니다.
  • 메모리 관리 의미를 즉시 명확하게합니다.
  • 접근 자 메서드를 사용하여 인스턴스 변수를 설정합니다.

또한 코드를 한 줄로 줄이려는 욕구가 많은 사람들이 Autorelease를 사용하는 이유입니다.

self.aController = [[[AController alloc] init] autorelease];

이론상 iPhone 자동 릴리스는 다소 비싸기 때문에 (이유를 명확하게 설명하지 못함) 다른 곳에 개체를 할당 한 직후 명시 적으로 릴리스 할 수 있습니다.


Xcode를 사용하는 경우 정적 분석기로 이러한 코드를 감지하는 데 도움이 될 수 있습니다. Build >> Build and Analyze를 누르십시오.

대체 텍스트

이것은 그러한 코드 조각에서 매우 유용한 메시지를 보여줄 것입니다.

대체 텍스트


주의해야 할 또 다른 사항은 예제가 aController의 @property 정의에도 의존한다는 것입니다.

그것이 정의 된 경우 @property (readwrite, retain) id aController;예제가 작동하는 반면, @property (readwrite, assign) id aController;해제에 대한 추가 호출로 인해 객체가 할당 해제됩니다.


당신은 또한 할 수 있습니다

@property (nonatomic, retain)AController *aController;
...
self.aController= [[AController alloc] init];
[aController release];

동일한 방식으로 작동하지만 혼동이 적기 때문에 다른 방식을 사용하는 것이 더 좋습니다. 그것은 setAController가 그것을 유지하기 때문이 아닙니다.

참조 URL : https://stackoverflow.com/questions/156243/object-allocate-and-init-in-objective-c

반응형