Objective C에서 객체 할당 및 초기화
객체를 할당하고 초기화하는 다음 두 가지 방법의 차이점은 무엇입니까?
AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];
과
self.aController= [[AController alloc] init];
대부분의 사과 예제는 첫 번째 방법을 사용합니다. 할당, 초기화 및 객체 처리 후 즉시 해제하는 이유는 무엇입니까?
모든 개체에는 참조 횟수가 있습니다. 0이되면 객체가 할당 해제됩니다.
속성이 다음과 같이 선언되었다고 가정합니다 @property (retain)
.
첫 번째 예, 한 줄씩 :
- 객체는에 의해 생성되었으며
alloc
참조 횟수는 1입니다. - 객체는
self
의setAController:
메소드 로 넘겨지고 ,retain
메시지 를 전송합니다 (메서드가 객체가 어디에서 오는지 알 수 없기 때문에), 참조 횟수를 2로 증가시킵니다. - 호출 코드는 더 이상 객체 자체가 필요하지
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
'your programing' 카테고리의 다른 글
Androidx 프로젝트에서 Android 지원을 사용한 라이브러리를 사용할 수 있습니까? (0) | 2020.12.29 |
---|---|
C #-공개적으로 상속 된 메서드를 숨길 수 있음 (예 : 파생 클래스에 대해 비공개로 설정) (0) | 2020.12.29 |
Boost.Process는 어디에 있습니까? (0) | 2020.12.29 |
ResolveUrl과 ResolveClientUrl의 차이점은 무엇입니까? (0) | 2020.12.29 |
Xml 네임 스페이스로 Linq to Xml 사용 (0) | 2020.12.29 |