2011-08-04 3 views
1

시나리오 1의 차이 무엇 :두 개의 코드 시나리오

NSDictionary *dictionary = 
       [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
self.stateZips = dictionary; 
[dictionary release]; 

시나리오 2 : stateZips 재산에

self.stateZips = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

답변

4

dependes가.
retained 인 경우 :
시나리오 1 : stateZips이 적절히 유지됩니다 (stateZips의 릴리스는 dealloc을 호출합니다). 또한 지역 사전도 그곳에 공개됩니다.
시나리오 2 : stateZips은 두 번 유지됩니다 (stateZips의 릴리스는 아직 보유 된대로 해당 dealloc을 호출하지 않습니다).

그것은 assigned 경우 :
시나리오 1 : 발표 사전에 stateZips 점과 충돌이 발생할 수 있습니다 다른 어디를 접근.
시나리오 2 : stateZips이 적절하게 유지됩니다 (stateZips의 릴리스는 dealloc을 호출합니다). 내가

+0

죄송합니다. Tatvamasi, 내가 게시 할 때 귀하의 질문을 보지 못했습니다. 그들은 매우 유사합니다. 나는 당신의 투표를 올렸지 만 나는 약간의 차이가있는 것처럼 보이기 때문에 나는 내 것을 떠날 것이다. – sidyll

1

(적어도이 코드 조각)이 아니 당신의 의도를 생각으로

copy

이 고려되지 않는 모두 self.stateZips 파일로 초기화 된 사전 설정 plistPath에서 지적되는 원인이된다.

두 번째로는 초기화 된 사전에 대한 포인터가 저장되지 않았고 보유 수 +1의 객체이므로 기술적으로 메모리 관리의 균형을 맞추기 위해 어떤 장소에서 메시지를 보내야합니다 (release). . 그러나 객체에 대한 포인터를 검색 할 수있는 방법이 없기 때문에 메모리 누출이 발생할 수 있습니다.

두 가지 예외 사항이 적용됩니다

1.Garbage 컬렉션
을 당신이 쓰레기 수거 환경에 있다면, 모두 동일합니다. 음, 그들은 같지 않지만 그 결과는 비슷합니다. stateZips의 세터는 단순히 포인터를 할당하는 경우

2.Property 유형
는, 당신은 바르 포인터를 사용하여 객체를 해제 할 수 있습니다. 다음 두 코드는 단 하나의 차이점 만 있습니다. 전자에서는 객체가 사용 된 직후에 릴리스됩니다. 후자의 경우, 그것은 단지 "정의되지 않은"것입니다. 컨텍스트가 없으면이 개체가 릴리스되었는지 여부와 언제 확인할 수 없습니다.

+0

이게 맞습니까? 확실히 컴파일러는 이것을 최적화하여 하나의 retain 만 호출하도록 할 수 있습니까? objective-c에서 메모리 관리에 관해 읽은 모든 내용에서 시나리오 2의 예를 누출로 본 적이 없습니다. – iandotkelly

+0

속성이 유지되면 Scenario2 *가 누수됩니다. – progrmr

0

나는 stateZips가 retain 속성을 가진 속성이라고 가정합니다.

시나리오 1에서 첫 번째 줄에 보유 개수가 1 인 사전이 생성됩니다. 두 번째 줄에서 속성은 retain을 다시 호출하여 retain count를 2로 증가시킵니다. 마지막으로 retain count는 release에 의해 감소됩니다. 이렇게하면 사전에 올바른 보유 수를 남깁니다.

시나리오 2에서 보유는 한 번만 호출됩니다.

두 시나리오의 최종 효과는 같습니다. 사전 객체는 유지되며 클래스의 dealloc 메소드에 릴리스를 포함해야합니다.

컴파일러가 올바르게 처리하지 못하면 objective-c의 retain/release 규칙을 따르는 것이 매우 어려울 것입니다.

관련 문제