2012-02-10 10 views
1

- (void)dealloc 방법에서 IBOutlet에서 nil으로 선언 된 retain 수식어로 모두 @property을 설정해야합니까? 그렇게하지 않으면 메모리가 낭비되거나 낭비 될 것입니까?iOS : dealloc & IBOutlet

자동 참조 횟수가 꺼져 있다고 가정합니다.

+0

가능한 복제본 [dealloc에서 출구 변수를 0으로 설정해야합니까 (IOS 3.0 이후에도 가능합니까?)] (http://stackoverflow.com/questions/5658535/is-it-required-to-set-outlets) -varibles-to-nil-in-dealloc-even-after-ios-3-0) –

답변

0

귀하의 질문은 "어떻게 dealloc에서 속성을 처리합니까?"것 같습니다. 그럼 예제를 살펴 보겠습니다. 시야가 myView를로드

@property (retain, nonatomic) IBOutlet UIView *myView; 

두 개체가 유지된다 (내부 addSubview: 또는 유사한 의해) 뷰 구조 및 (속성 세터 법에 의해) 뷰 컨트롤러. 간단한 로그만으로이 사실을 확인할 수 있습니다. viewDidLoad이 코드를 배치하는 것은이이 포인터를 해결해야하는 두 가지 방법이 있으며, 모두 자동으로 Xcode에 의해 당신을 위해 채워집니다 2.

NSLog(@"myLabel is retained: %i", myView.retainCount); 

의 출력이 확인됩니다.

처음에는 viewDidUnload (일반적으로 메모리 부족 상황에서만 호출 됨) 뷰를 해제하려는 경우, 매달린 포인터가 생기므로 포인터를 nil로 설정하려고합니다. Xcode는 단순히 setter 메서드를 사용하여이 작업을 수행합니다.

[self setMyView:nil]; 

두 번째 장소와 처음 질문 한 장소는 dealloc입니다. dealloc 당신은 마찬가지로이 경우 (질문에 IBOutlet 기반의 메인 스레드 만 실행) 매달린 포인터가 문제가되지 않아도 귀하의 속성을 릴리스해야합니다. 이는 Xcode가 dealloc을 자동으로 구현함으로써 강화 된 것으로 보입니다. 전혀 유해하지 않을 것이라고 발표 이외에 nil 포인터를 설정 물론

[myView release]; 

. 그리고 이것이 주 스레드가 아니라면 더 좋을 수도 있습니다 UIKit 요소. 그러나 멀티 스레딩에 대해 걱정한다면 atomic을 대신 사용하면됩니다.

1

ARC가 없어도 nilIBOutlets-(void)dealloc을 입력 할 필요가 없습니다. 인스트루먼트를 테스트하면 UIView 할당이 해제 되 자마자 IBOutlets에 연결된 인터페이스 요소의 메모리가 정상적으로 릴리스됨을 알 수 있습니다.

그러나 앱에서 스레딩을 사용하는 경우 다른 스레드가 문제의 오브젝트가 아직 사용 가능한지 여부를 쉽게 판단 할 수 있으므로 스레딩을 사용하는 것이 좋습니다.