2012-05-09 3 views
0

나는 한 무리의 UIButton 하위 클래스를 인스턴스화하고 self.view 및 변경할 수있는 배열에 추가하는보기 컨트롤러가 있습니다. 이 하위 클래스에는 차례대로 다른보기를 가리키는 retain 속성이 있습니다. 대부분의 경우 뷰 속성은 UIButton 하위 클래스 인 'superview (추가 된 뷰 컨트롤러의 self.view)를 가리 킵니다. 그러나 항상 그런 것은 아니며 꼭 그런 것은 아닙니다. 그래서 내가이 속성을 사용하고 상속받은 superview를 사용하지 않는 이유입니다.서브 뷰의 dealloc을 호출하지 않도록 뷰 유지주기를 수정하는 방법은 무엇입니까?

난 데 문제는 뷰 컨트롤러의 할당 해제가하는 때이다 :

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

있는 UIButton 서브 클래스 '의 dealloc 호출되지 않습니다. 따라서 이러한 하위 클래스의 뷰 속성에 대한 추가 릴리스가 호출되지 않고 뷰 컨트롤러가 할당 해제 된 경우에도 각 UIButton 하위 클래스에 대해 한 번 뷰 컨트롤러 뷰가 누출됩니다.

대신에 내가 dealloc에서 release를 호출 할 필요가 없도록 서브 클래스의 view 속성을 assign으로 만들면 dealloc이 호출되고 뷰를 참조하는 코드가 없을 때에도 응용 프로그램이 충돌합니다.

아이디어가 있으십니까?

+0

분명히 아크가 없으므로 버튼을 놓을 수 있습니까? – CodaFi

+0

superview 이외의 다른보기가 귀하의 버튼을 참조합니까? –

+0

@CodaFi ARC 권한 없음. 그리고 버튼은 배열에서 release를 호출 할 때 해제되어야합니다 (배열은 release를 호출해야합니다). 또한 배열을 해제하기 전에 removeAllObjects를 호출 해 보았습니다. – SaldaVonSchwartz

답변

0

viewcontroller가 유지주기에 없다면 단추의 추가 보유 속성을 nil로 설정하여 dealloc (및 해당 viewDidUnload)의주기를 중단 할 수 있습니다.

처음에는 보관주기를 만들지 않는 것이 좋지만, 귀하의 경우에는 피하는 방법에 대한 귀하의 질문에 충분한 단서가 없습니다.

+0

그래, 뷰 컨트롤러 자체는 유지되지 않습니다. 그 견해가 있습니다. 그리고 내가 말한 것처럼 컨트롤러의 기본보기 이외의 다른보기가 버튼에 의해 참조 될 수 있으므로이 작업을 수행했을뿐입니다. 그러나 속성을 nil로 설정하면 분명히 앱이 충돌합니다. 이상한. 어쨌든이 시점에서 나는 속성을 없애고 view 속성이 컨트롤러의 뷰를 가리킬 경우 상속 된 superview를 사용합니다. – SaldaVonSchwartz

관련 문제