programing

커스텀 할당 해제 및 ARC(객관-C)

minxs 2023. 4. 16. 15:50
반응형

커스텀 할당 해제 및 ARC(객관-C)

나의 작은 iPad 앱에는 옵서버를 사용하는 "스위치 언어" 기능이 있다.모든 뷰 컨트롤러는 그 동안 옵서버에 등록됩니다.viewDidLoad:.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}

사용자가 "언어 변경" 버튼을 누르면 새 언어가 내 모델에 저장되고 관찰자에게 알림이 전달되고 호출됩니다.updateUi:셀렉터를 선택합니다.

이것은 TabBarController에 뷰컨트롤러가 있는 경우를 제외하고 매우 잘 작동합니다.이는 탭 막대가 로드될 때 보기를 초기화하지 않고 하위 컨트롤러에서 탭 아이콘을 가져오기 때문입니다.viewDidLoad:이 뷰 컨트롤러는 호출되지 않으므로 언어 변경 알림을 수신하지 않습니다.이것 때문에, 나는 내 몸을 움직였다.registerObject:에의 콜init방법.

내가 사용했을 때viewDidLoad:내 관찰자에게 등록하기 위해, 나는 이용했다.viewDidUnload:등록해제합니다.지금 등록하고 있기 때문에init등록해제하는 것은 매우 의미가 있습니다.dealloc.

하지만 여기 내 문제가 있다.글을 쓸 때:

- (void) dealloc
{
    [observer unregisterObject:self];
    [super dealloc];
}

다음의 에러가 표시됩니다.

ARC는 '할당 해제'의 명시적 메시지 전송을 금지합니다.

전화해야 하니까[super dealloc]슈퍼클래스가 제대로 청소할 수 있도록 하지만 ARC는 그걸 금지하고 있어, 난 이제 갇혔어.내 물건이 죽어갈 때 알림을 받을 수 있는 다른 방법이 있나요?

ARC를 사용할 때는 단순히 콜을 하지 않습니다.[super dealloc]명시적으로 - 컴파일러가 대신 처리합니다(Clang LLVM ARC 문서 7.1.2 장 참조).

- (void) dealloc
{
    [observer unregisterObject:self];
    // [super dealloc]; //(provided by the compiler)
}

언급URL : https://stackoverflow.com/questions/7292119/custom-dealloc-and-arc-objective-c

반응형