2012-05-07 2 views
8
#import <UIKit/UIKit.h> 
#import "UCMapviewController.h" 
#import "UCMenuviewController.h" 
#import "UCOverviewController.h" 

@interface UCRootViewController : UIViewController 

@property (weak, nonatomic) UCMapviewController *mapviewController; 
@property (weak, nonatomic) UCMenuviewController *menuviewController; 
@property (weak, nonatomic) UCOverviewController *overviewController; 

다음은 이러한 하위 viewController를 관리해야하는 UCRootViewController의 선언입니다. 그는 나중에 하나의 컨트롤러가 표시되어야하는지 여부를 처리 할 대리인이됩니다.내 sub-viewController에 약하거나 강한 속성이 있습니까?

rootViewController는 UIAppDelegate에서 강하게 유지되며 항상 활성 상태로 유지됩니다.

하위 뷰 컨트롤러를 약하게 만드는 것이 맞습니까? 100 % 확신 할 수는 없지만 포인터를 가리키는 포인터가 없을 때 weak 포인터가 할당 취소된다는 것을 이해하는 한. 근원이 강할수록 약 해지는 것이 맞습니다. 맞습니까?

#import <UIKit/UIKit.h> 

@class UCRootViewController; 
@interface UCOverviewController : UIViewController 

@property (weak, nonatomic) UCRootViewController *rootviewController; 

내 하위 viewController 중 하나의 헤더입니다. 그들은 (나중에) delegate rootviewController에 약한 포인터를 가지고있다. @class UCRootviewController이 위임 메서드를 호출하도록 선언하는 것으로 충분합니까? 나는 이것을 필요로 할까?

감사

편집 : 난 그냥 a nice article about ViewControllers 및 통과 읽어

항상 높은 품질의 뷰 컨트롤러의 용기 또는 +를 사용을 [UIViewController에 presentModalViewController : 애니메이션 :] 응용 프로그램에서 뷰 컨트롤러를 표시 . 보기 컨트롤러 어딘가에 참조 번호 을 유지해야하는 경우 이 캐싱을 위해 더 오래 살아 남기를 원한다면 약한 참조를 사용하십시오. 이러한 경우에는 메모리 부족 상태에 올바르게 응답해야합니다.

약한 참조를 사용합니다. 이에 대한 의견은 무엇입니까?

+2

약한 참조는 ViewController에 강력하게 사용되는 컨테이너를 사용할 때 사용합니다. 내 답변에 썼을 때, 예를 들어 내비게이션 컨트롤러를 사용할 때 약한 참조를 사용하면 문제가 없습니다. 그러나 당신이 현재의 VC의 뷰에 그들의 뷰를 서브 뷰로 추가했기 때문에 컨트롤러를 주변에 유지하고자 할 때, 강한 포인터를 사용할 필요가 있습니다. 그렇지 않으면 그들은 미리 할당이 해제 될 것입니다. –

+0

대단히 감사합니다. – MJB

답변

9

강력한 포인터는 rootViewController와 연결됩니다. 그렇다고해서 rootViewController 내부의 다른 viewController에 자동으로 강하게 연결된다는 의미는 아닙니다.

다른 viewController가 원하지 않는 방식으로 할당 해제되지 않도록 해당 속성을 강하게 설정해야합니다.

네비게이션 스택에 넣으면 네비게이션 스택이 자동으로 강점을 나타 내기 때문에 괜찮습니다. 그러나 rootViewController에서 뷰를 하위 뷰로 추가하려는 경우 해당 속성이 강력한 지 확인해야합니다.

개체에 대한 강력한 포인터가 없을 때 개체 할당이 해제됩니다. 그리고 다른 viewController에 대한 강력한 포인터가 없기 때문에 그들은 할당 해제됩니다.

+0

강하게 지적한 물체가 가리키는 것이 아니라는 것을 의미한다고 생각했습니다. 그래서 rootviewC가 강해서 내 appdelegate, 그것은 취소되지 않을 것이며, 다른 사람에게 그 ok를 가르키는 한. 그러나 나는 분명히 그것을 오해했다. – MJB

2

Strong은 ARC가 게시자를 대신하여 게시자를 관리한다는 점을 제외하면 retain과 같습니다. Weak은 부모가 자식을 유지하고 그 반대의 경우에도 보유주기를 피하는 것입니다.

__weak는 참조 된 개체를 활성 상태로 유지하지 않는 참조를 지정합니다. weak 참조는 객체에 대한 강력한 참조가 없을 때 nil로 설정됩니다. 여기

가 링크입니다 : Weak and strong property setter attributes in Objective-C

당신이 주변이보기 컨트롤러를 유지하려는 점을 감안, 최선의 선택은 강한 참조입니다!필요하기 전에 풀어 놓지 않도록하십시오!

관련 문제