2016-09-27 12 views
-2

Objective-C에서 수동 메모리 관리를 배웠고 모든 기사에서 "객체의 보유 개수가 0으로 떨어지면 dealloc 메소드가 호출되고 객체가 파괴됩니다"라고했습니다. 그리고 아무것도.Objective-C 오브젝트의 보유 수를 0 아래로 떨어 뜨릴 수 있습니까?

그러나 몇 가지 질문에 대한 대답은 없습니다. 보유 수를 0 미만으로 줄일 수 있습니까? 객체가 죽기 전에 [object release] 번을 연속적으로 호출 할 수 있습니까? 그러면 보유 수는 0 아래로 떨어 집니까? 그리고 내가 그렇게한다면, 우주는 여전히 존재할 것인가?

Google은 다음과 같이 아무것도주지 않습니다. "왜이 질문을 던지겠습니까? 아무도 신경 쓰지 않습니다. 가서 메모리 관리에 대해 다시 읽으십시오."

+1

"목표 초과 방출 C"검색 시도 –

+0

Google에서 제안한 제안은 귀하에게 올 바릅니다. 당신이 틀린 분야의 일을하고있는 것처럼 보이는 것은 개발자가 아닌 사상가가되어야합니다. 메모리 관리에 대한 연구/노력을 분명히하기 위해서는 매우 열악합니다. 묻는 모든 질문에서 실제 세계와 관련이 없습니다. 지구가 왜 구체인지 묻는 것과 같습니다. 목표 C가 마음에 들지 않으면 자신 만의 언어를 만들어서 계속 보유 할 수 있습니다. 그것이 당신에게 의미가 있는지 알기도합니다. –

+1

왜이 질문을합니까? 아무도 신경 쓰지 않는다. 다시 한번 메모리 관리에 대해 읽어보십시오. – matt

답변

2

보유 수 일 때 release으로 전화하면 즉시 dealloc이 호출됩니다. 따라서 보유 수는 0까지 올라가지 않습니다.

release을 추가로 호출하면 할당 해제 된 객체를 역 참조하기 때문에 런타임 오류가 발생합니다.

+0

보유 수는 절대로 0으로 떨어지지 않습니다. 런타임은 객체를 파괴하기 전에 감소하는 사이클을 낭비하지 않습니다. – bbum

+2

@bbum에 대한 추가 세부 정보를 보내 주셔서 감사합니다. –

-3

A는 카운트가 0 이상하지만 결코 덜 수 있습니다 유지 :

그래서 아니, 우주는 그 시점에서 존재하지 않습니다. 객체에 힙 메모리 ( alloc init)가 할당되면 보유 수는 1로 설정됩니다. 그런 다음 보유 수를 늘리려면 retain을 호출하면됩니다. (무제한으로 알고 있지만 잘못되었을 수도 있음). release 호출

단순히 주기적 객체의 카운트를 유지 확인하여 이미 할당 해제 개체 release 호출 0

의 개수와 임의의 할당을 해제 중 하나를 호출하는 것과 동일하다 다음 (1)에 의해 시스템을 유지할 수 감소 메서드를 사용하여 NULL 또는 void을 반환해야합니다. 그러나 힙 메모리를 관리하는 것이 확실하다면 VERY에 대해 알고 있어야합니다.

몇 가지 흥미로운 점 :

Why can a retain count be more that 1?

이는 여전히 다른 것을 요구하는 동안 객체가 해제되지 않도록이다. 예 : petownervet이라고 말합니다. pet 인스턴스는 owner 인스턴스에 의해 소유됩니다. ownervet 인스턴스로 이동하고 vetpet의 소유권을가집니다. 일정 기간 동안 pet에는 두 명의 소유자가 있으므로 retain이 호출 된 경우 보유 수는 2입니다. 이 pet으로 끝나기 전에 owner이 해제됩니다. 모든 것이 올바르게 수행 되었다면, release으로 전화하여 owner에서 reatain 카운트를 1로 줄이게됩니다. vetpet으로 끝낼 수 있으며 release으로 전화하면 pet이 할당 해제됩니다.

ARC

난 당신이 모두 계산 자동 참조로 대체되었습니다 알고 확신한다. 개발자는 객체가 다른 객체와 갖는 관계 유형을 간단하게 알아야합니다.

당신이 범위를 벗어날 떨어질 때 할당이 해제됩니다 이제 객체를 생성 따라서 경우 하지 않는가 다른 객체에 의해 강한 관계 (소유)가 있습니다. 두 객체가 서로 강한 관계를 가지고 있으므로 할당 해제 대상이되지 않는 경우에도 Reatain주기를 얻을 수 있습니다.

매우 긴 시간이 필요하지만 메모리 관리는 응용 프로그램 프로그래밍의 핵심 부분이며 매우 흥미 롭습니다.

+2

"이미 할당 해제 된 객체에서 호출하는 호출은 NULL에서 모든 메소드를 호출하는 것과 같습니다."포인터가 실제로'nil'으로 설정된 경우에만. 할당 해제 된 객체에 'release'를 보내는 것은 프로그래머 오류입니다 : 정의되지 않은 동작입니다. –

+3

이 답변은 매우 잘못 시작됩니다. 보유 개수는 ** ** 0이 될 수 없습니다 **. 시스템 **은 ** 정기적으로 아무 것도 확인하지 않습니다. 할당 해제 된 객체에 대한 메소드 호출은 정의되지 않은 동작이며 충돌하지 않을 것입니다. ** 모든 메소드를 NULL로 호출하는 것과 같습니다 **. 'vet' /'owner' /'pet' 유추는 그 자리에 있습니다. – bbum