출시 된 물체는 언제 파괴됩니까?
-
07-07-2019 - |
문제
Objective-C에서 객체를 해제 할 때 (출시 수는 1이라고 가정 할 때) 해제 수는 0으로 감소되고 Dealloc 메소드가 호출됩니다. 물체가 바로 거기에 파괴 된 다음 [Super Dealloc] 이후에 수영장에 추가되어 수영장이 배수 될 때 파괴 되었습니까?
나는 Dealloc의 끝에서 릴리스 된 객체가 파괴되었다고 가정합니다 ([Super Dealloc]이라고 불렀을 때) AutorELEASE 변수가 풀에 추가 된 것을 알고 있습니다.
건배 -기세 -
해결책
우선, 대상 c 프로그래밍 언어 메모리 관리 개념이 없습니다. 메모리 관리는 기초에 내장되어 있습니다 (Mac OS X 및 iPhone OS에 대한 Cocoa Touch 용 Cocoa의 일반적인 프레임 워크). Foundation은 구현하는 루트 클래스 nsobject를 추가합니다 alloc
, retain
, release
그리고 autorelease
편의 포장지 위에 class_createInstance()
그리고 object_dispose()
Objective-C 런타임의 기능.
Objective-C는 메모리 관리 Agnostic이므로 쓰레기 수집을 추가하고 모든 메모리 관리 방법을 작성합니다. NSObject
No-OPS는 매우 쉬웠습니다. 그러나 iPhone OS 및 Legacy Mac OS X에는 쓰레기 수집이 없으며 코코아에는 참조 계산 체계를 사용합니다.
호출 할 때 객체가 생성됩니다 alloc
수업 방법 NSObject
또는 NSProxy
재단에서. 이러한 기본 구현은 호출됩니다 class_createInstance()
수동으로 절대 필요하지 않습니다.
"죽음"을 할 때 dealloc
루트 클래스에서 실행됩니다 NSObject
. 이것은 힙의 객체에 대한 메모리가 object_dispose()
, 당신은 당신이 상속하는 한이 기능을 직접 호출 할 필요가 없습니다. NSObject
또는 NSProxy
재단에서.
AutorELEADERED 개체는 런타임에 관한 한 특별한 처리되지 않습니다. 자동 릴리스 물체는 다른 물체만큼 살아 있습니다. 당신이 일어날 일은 어떻게됩니다 autorelease
대상은 대략적으로;
-(id)autorelease; {
[NSAutoreleasePool addObject:self]; // retain count +1
[self release]; // retain count -1
return self;
}
부름 autorelease
유지 카운트를 줄이지 않으면 발신자에서 현재 자동 제출 풀로 객체의 소유권을 전송합니다. 나중에 현재 AutoreLease 풀이 사라지면 호출합니다. release
소유 한 모든 객체에 대해 더 이상 소유하지 않는 모든 객체가 릴리스됩니다.
다른 팁
예, 고정 계산이 0에 도달하자마자 거래됩니다.
AutorELEASE 시스템은 소유권이 약간 "모호한"물체를위한 것입니다. 즉, 소유하고 싶지 않은 신선한 물체를 반환하고 평생을 알 수없고 발신자가 취할 것이라고 가정하고 싶지 않습니다. 대한 책임. AutoreLease 풀이 배수되면 (일반적으로 런 루프 주변에서) 모든 구성원이 출시됩니다. 당신의 물건을받은 발신자가 그에 대한 책임을지고 싶다면 필요한 것은 그것을 유지하기 만하면 거래를 피할 수 있습니다.