2012-12-12 5 views
0

UITabBarControllerUITabBarControllerDelegate을 서브 클래 싱하여 탭 스위치와 관련된 특정 이벤트를 처리합니다. ARC - 위임 (할당)이 너무 일찍 릴리스되었습니다.

지금 우리의 사용자 정의 탭 표시 줄 컨트롤러에서 우리는이 :

우리가 ARC에 프로젝트를 전환 이후
- (id)initCustomTabBarController { 
    self = [super init]; 
    if(self) { 
     [self setDelegate:[[CustomTabBarControllerDelegate alloc] init]]; 
     // ... 
    } 
    return self; 
} 

이 대리자가 할당이 해제 된 인스턴스로 실행 탭 스위치를 일으키는 조기에 해제됩니다.

이 속성은 UITabBarController.hassign으로 정의되어 있습니다. 분명히 영향을 미치지 않습니다.

delegate 객체를 init 메소드보다 "live"오래 지속되게하려면 어떻게해야합니까?

+0

언제 ARC 전에 출시 했습니까? – Thilo

+0

관련 항목 : http://stackoverflow.com/questions/12786748/transitioning-to-arc-causing-delegate-issues?rq=1 – Thilo

답변

2

약식이기 때문에 대리인이 개체에서 오래 머물러 있지 않을 것으로 예상됩니다. 객체를 생성했음을 기억하십시오. 객체를 유지하는 것은 사용자의 몫입니다.

그러나 사용중인 패턴이 올바르지 않습니다.

대리자의 요점은 충분한 정보가 없기 때문에 클래스가 자체에 대해 추가 할 수없는 클래스에 메서드 구현을 제공한다는 것입니다. 예를 들어, 테이블 뷰 대리자. 테이블 뷰는 일반화하기 위해 표시 할 행 또는 섹션의 수를 알 수 없으므로 위임자가이 정보를 제공하도록 요청합니다.

귀하의 경우 자신의 대리인을 만드는 개체가 있습니다. 그렇다면 왜 대의원이 필요합니까? 클래스의 메서드를 구현하기 만하면됩니다.

+0

각 iPhone마다 하나의 탭 표시 줄 컨트롤러 하위 클래스가 있으므로 메소드가 다른 클래스에 있습니다. iPad. –

+0

내가 틀렸어. 실제로 한 클래스에서만 사용되었다. 같은 클래스에서 위임 메소드를 구현했다. 잘못된 아키텍처를 지적 해 주셔서 감사합니다! –

2

예 ARC에서는 아무런 언급이 없으므로 정상적으로 처리됩니다 (강도가 높아짐).주기 종료시에 해제해야합니다.

클래스를 지정하는 곳에서 속성을 지정하면 CustomTabBarControllerDelegate을 강하게 만듭니다. 그런 다음이 속성을 대리자에 할당합니다.

ARC가 아닌 방식으로 설정 한 경우 메모리 누출이 발생할 수 있습니다.

관련 문제