5

"bar"라는 다른 객체를 속성으로 사용하여 "foo"라는 객체가 있다고 가정 해 보겠습니다.Objective-C : 부모 개체의 할당을 해제하기 전에 속성 개체를 dealloc해야합니까?

"foo"가 할당 해제되면 "bar"에 대한 모든 참조가 자동으로 제거되므로 "bar"도 할당 해제됩니까? 또는 "foo"할당 해제 및 어딘가에 메모리에 떠있는 "bar"것인가? 모든 "bar"의 참조가 "foo"에 정의 된 경우에도 마찬가지입니다.

미리 감사드립니다.

답변

15

는, 예를 들어, 당신은 다음 중 하나로 속성을 선언 할 때 foo 할당 해제 :

- (void)dealloc 
{ 
    [bar release]; 

    [super dealloc]; 
} 

당신이에 대한 모든 참조를 제거 할 때까지 당신을 위해 무료로하지 bar의 메모리 공간 (즉 참조 카운트가 0으로 내려 간다) 것입니다 시스템, 그래서 참조 횟수와 개체를 직접 모니터링해야합니다.

+2

+1 또한 속성이'copy'로 선언 된 경우 릴리스해야합니다. –

2

메모리를 할당하는 경우이를 해제해야합니다. 예, dealloc[bar release] 또는 self.bar = nil (합성 속성과 그 모든 것을 사용하는 경우) 전화를 겁니다.

See here iOS의 메모리 관리 소개.

@property (nonatomic, retain) NSString *bar; 
// Or 
@property (nonatomic, copy) NSString *bar; 

당신은 때 bar을 해제해야합니다 다음 foo 객체가 어떤가 유지 또는 (감사 데이브) bar의 사본이있는 경우

+1

'bar = nil'은 그것을 자르지 않을 것이다.'self.bar = nil' 또는'[self setBar : nil]'을 사용하여 대상 객체를 실제로 해제합니다. 그러나,'-dealloc'에서'self' 메소드를 호출하는 것은 좋지 않으므로'[bar release]'를 대신 호출하십시오. –

+0

네가 옳다면 미안하지만,'self.bar = nil'. 애플의 문서와 샘플 코드는 종종'self.prop = nil'을한다. 그러나 나는 대체로 동의한다. – rfunduk

0

개체 A는 할당이 해제되면 다른 개체 (개체 B, 개체 C 등)에 대한 참조를 해제합니다. 이는 자동으로 발생하지 않습니다.

이것은 개체에 -dealloc 방법으로 수행됩니다

- (void)dealloc 
{ 
    [propertyB release]; 
    [propertyC release]; 
    [super dealloc]; 
} 

(속성은 읽기/쓰기 및 retain로 표시했습니다 경우 또는, 당신은 등, [self setPropertyB:nil]을 대체 할 수 있습니다).

그래서 개체 A에 대한 모든 참조가 사라지면 할당이 해제되고 속성 B와 C에 대한 참조 횟수가 줄어 듭니다. 이러한 개체가 개체 A에 의해서만 소유되면 해당 개체도 종료됩니다 결과적으로 할당이 해제됩니다.

(태그가 달린 모든 iPhone OS 개발에 해당됩니다. Mac에서 가비지 수집 환경에 대해 이야기하는 것은 아니며, 규칙과 동작이 다르며 자동으로 일부 작업을 수행합니다.)

0

self.bar = nil을 사용하는 큰 이유는 막대가 nib 파일 내에서 만들어진보기에 대한 참조 인 경우입니다. 이 경우 -(void)viewDidUnload에 해당 행이 포함되므로보기를 섞어서 시스템에서 해당 객체를 해제 할 수 있습니다. 뷰가 돌아 오면 nib 파일을 통해 다시로드됩니다. 그러나 이것은 사용하지 않아도된다. 또는 [bar release]에서 -(void) dealloc