문제

xib 파일에 연결된 UILabel과 같은 것이 있는 경우 내 뷰의 할당 해제 시 이를 해제해야 합니까?물어보는 이유는 할당을 안해서 그렇다고 풀어줄 필요도 없을 것 같은 느낌이 들죠?예: (헤더에서):

IBOutlet UILabel *lblExample;

구현 시:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}
도움이 되었습니까?

해결책

현재 모범 사례로 간주되는 사항을 따른다면, ~해야 한다 아웃렛 속성을 해제합니다. 왜냐하면 set 접근자에 이를 유지했어야 했기 때문입니다.

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

이 접근 방식의 장점은 메모리 관리 의미를 명시적이고 명확하게 만든다는 것입니다. 모든 nib 파일에 대해 모든 플랫폼에서 일관되게 작동합니다..

메모:다음 설명은 iOS 3.0 이전에만 적용됩니다.3.0 이상에서는 대신 viewDidUnload의 속성 값을 없애야 합니다.

그러나 여기서 고려해야 할 한 가지는 컨트롤러가 사용자 인터페이스를 폐기하고 요청 시 이를 동적으로 다시 로드할 수 있는 경우입니다(예를 들어 nib 파일에서 뷰를 로드하지만 요청 시 메모리 부족 상황에서 호출하는 뷰 컨트롤러가 있는 경우). -- 뷰가 다시 필요할 경우 다시 로드할 수 있다는 기대를 갖고 해제합니다.이 상황에서는 기본 뷰가 폐기될 때 다른 아웃렛의 소유권도 포기하여 해당 아웃렛도 할당 취소될 수 있도록 해야 합니다.UIViewController의 경우 재정의하여 이 문제를 처리할 수 있습니다. setView: 다음과 같이:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

불행하게도 이는 또 다른 문제를 야기합니다.UIViewController는 현재 dealloc 을 사용하는 방법 setView: 접근자 메서드(단순히 변수를 직접 해제하는 대신) self.anOutlet = nil 호출될 것이다 dealloc 뿐만 아니라 메모리 경고에 대한 응답으로 ...이로 인해 충돌이 발생합니다. dealloc.

해결책은 콘센트 변수도 다음으로 설정되어 있는지 확인하는 것입니다. nil ~에 dealloc:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}

다른 팁

Apple 문서에서 내가 찾고 있던 것을 찾았습니다.간단히 말해서 객체를 해제하고 유지하는 속성(또는 @property, @synthesize)으로 설정할 수 있지만 UILabels와 같은 경우에는 그럴 필요가 없습니다.

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

그만큼

[anOutlet release], anOutlet = nil;

setView를 작성한 경우 부분은 완전히 불필요합니다.바르게.

할당 해제 시 해제하지 않으면 메모리 사용량이 늘어납니다.

여기에서 계측기 ObjectAlloc 그래프를 통해 자세한 내용을 확인하세요.

어떤 의미에서는 IB에서 레이블을 생성하여 레이블을 할당합니다.

IB가 하는 일은 IBOutlet과 그 정의 방법을 살펴보는 것입니다.IB가 일부 개체에 대한 참조를 할당하는 클래스 변수가 있는 경우 IB는 해당 개체에 유지 메시지를 보냅니다.

속성을 사용하는 경우 IB는 값을 명시적으로 유지하지 않고 값을 설정해야 하는 속성을 사용합니다.따라서 일반적으로 IBOutlet 속성을 보유로 표시합니다.

@property (nonatomic, retain) UILabel *lblExample;

따라서 다른 경우(속성 사용 여부)에는 dealloc에서 release를 호출해야 합니다.

Nib 메인 뷰의 하위 뷰인 IBOutlet은 객체 생성 시 자동 해제 메시지를 보내기 때문에 해제할 필요가 없습니다.dealloc에서 해제해야 하는 유일한 IBOutlet은 컨트롤러나 기타 NSObject와 같은 최상위 개체입니다.이것은 위에 링크된 Apple 문서에 모두 언급되어 있습니다.

IBOutlet을 속성으로 설정하지 않고 단순히 인스턴스 변수로 설정하는 경우에도 이를 해제해야 합니다.이는 initWithNib 시 모든 IBOutlet에 메모리가 할당되기 때문입니다.따라서 이는 코드에 메모리를 유지하거나 할당하지 않은 경우에도 해제해야 하는 특별한 경우 중 하나입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top