2012-05-30 2 views
0

내가 내가, 내가 그것을 사용자 정의 개체 ERSearchView를 할당하고 편곡에 추가 한ARC 이상한 행동 ARC와

self.arr = [NSMutableArray array]; 

로 할당

@property (strong, nonatomic) NSMutableArray *arr; 

속성이 활성화

ERSearchView *SV = [[ERSearchView alloc] initWithDelegate:nil]; 
    [arr addObject:SV]; 

내 검색보기에 검색 결과가 다시 나타나지 않기 때문에 dealloc 메서드를 재정의했습니다. 임대 됨 :

- (void)dealloc { 
    self.delegate = nil; 
    NSLog(@"deallocated search view"); 
} 

내 View Controller를 열 때 호출되지 않습니다. 그러나보기 컨트롤러에서 arr 변수를 0으로 설정하면 dealloc 검색보기가 삭제되었다는 로그 메시지가 나타납니다.

dealloc에 "dealloc"메시지가 있기 때문에보기 컨트롤러가 100 % 출시되었지만 arr 내부의 객체가 해제되는 것을 어떻게 가능하게 설명 할 수 있습니까?

+0

dealloc 메서드에서 [super dealloc]이 누락되었다고 생각합니다. init 및 dealloc 메소드에서 접근자를 피하기 위해 대신 iVars를 사용하십시오. – CarlJ

+3

ARC를 사용하면 슈퍼 클래스에 메시지를 보내는 범위 내에서 직접 'dealloc'을 호출 할 수 없습니다. – Eugene

+0

당신은 dealloc의 오버라이드에서 [super dealloc]이라고 부르지 않았지만, 제게 따르면 그가 포함시킨 모든 것이 릴리즈 된 컨테이너를 릴리스했기 때문에 아닙니다. –

답변

1

NSArray, NSDictionary 등과 같은 파운데이션 컬렉션 클래스는 포함 된 개체를 그대로 유지합니다 (또는 ARC- 말하기에 강하게 참조). 배열이 할당 해제되지 않은 한, 뷰 인스턴스를 포함하여 참조하는 객체는 여전히 메모리에 있어야합니다.

컨트롤러의 dealloc 메서드에서 속성을 nil으로 설정하지 않았기 때문에 이전에 배열을 유출 한 것처럼 보입니다. 객체가 strong이라는 속성을 선언하면이 누출을 피하기 위해 dealloc 구현에서 참조를 채 웁니다.

+0

정말요? ARC 환경에서 강력한 변수를 없애야한다는 것을 의미합니까? O_O 나는 그것이 자동적으로 만들어진 것이라고 생각했다. – Eugene

+0

다시 물어서 유감 스럽지만이 문제에 관해 읽을 수있는 문서에 대한 참조를 제공해 주시겠습니까? 나는 정말 당신의 대답에 감사드립니다. – Eugene

+0

도움이되었습니다. 정말 감사합니다. 정말 고마워요! 당신은 구세주였습니다. 수동 메모리 관리로 전환하려고했습니다. 고맙습니다! – Eugene