2012-07-03 6 views
2

여기 내 상황입니다 :보기 컨트롤러에 서브 뷰에 대한 링크를 유지

View hierarchy

이보기는 .xib에서 구축 : 아래 그림과 같이 내가 아마, 파단의 계층 구조를 관리하는 UIViewController 있습니다. 나는 topView의 각 서브 뷰에 액세스 유지할 수 있도록하고 싶습니다 - 그게 내가, 예를 들어, 말할 수 있도록 나는 각에 대한 포인터를 원하는이며, 뭔가 같은 : 보통

[button1 setText:@"Hello!"]; 

,이 작업을 수행하기 위해, I 나는 이런 식으로 뭔가를 보이는 헤더의 결과로, 인터페이스 빌더를 사용하여 액세스를하고자 할 각 요소를 연결할 :

이 인스턴스 변수는 내보기 컨트롤러 "얻는 시간 이후, 괜찮 __weak이다
@interface MyViewController : UIViewController 
{ 
    __weak IBOutlet UIView *view; 
    __weak IBOutlet UILabel *label; 
    __weak IBOutlet UIButton *button1; 
    __weak IBOutlet UIButton *button2; 
} 

@end 

"그들은 이미 내 View Controller의 루트보기에 속해 있습니다. (당연히, 빠른 다이어그램에서"topView "라고 표시했습니다.) 사실, 이러한 참조가 약해지기를 바랍니다. 루트보기가 해제 될 때 하위 참조가 모두 해제되어야합니다. 큰.

하지만 UI의 새로운 요소를 만들려한다고 가정 해 보겠습니다. 사용자 정의 버튼 일 수도 있고 전적으로 코드로 만들 수도 있습니다. 이 요소는 UIView에서 서브 클래 싱 될 CustomViewClass이라고 부릅니다. 생성 할 CustomViewClass의 인스턴스는 customButton이라고합니다. 내보기의 다른 하위보기와 마찬가지로 customButton의 "액세스"를 사용하여 상호 작용할 수 있습니다. 그러나 다른 하위 뷰와 마찬가지로 customButton은 superview에서 소유하게됩니다. 다시 말해서 내보기가 해제 될 때마다 공개되기를 원합니다. 이것은 내가이 뷰를 __weak 인스턴스 변수 또는 뷰 컨트롤러의 속성으로 선언해야한다고 생각하게 만듭니다.

@interface MyViewController : UIViewController 
{ 
    __weak IBOutlet UIView *view; 
    __weak IBOutlet UILabel *label; 
    __weak IBOutlet UIButton *button1; 
    __weak IBOutlet UIButton *button2; 
    __weak CustomViewClass *customButton; 
} 

@end 

그런 다음 내 구현 :

당신은 아마 이미 실현 한 것처럼
@implementation MyViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    customButton = [[CustomViewClass alloc] init]; 
    [[self view] addSubview:customButton]; 
} 
@end 

는,이 작동하지 않습니다, 그리고 컴파일러는 경고가 부팅을 던질 것이다의 그 해 보자. 뭔가 같이 :

Assigning retained object to weak variable; object 
will be released after assignment 

나는 현재 매우 빈약 한 스타일로 경고 이러한 종류의 닷지 :

@implementation MyViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CustomViewClass *customButtonLocal = [[CustomViewClass alloc] init]; 
    [[self view] addSubview:customButtonLocal]; 
    customButton = customButtonLocal; 
} 
@end 

그런 식으로, 내가 원하는 것을 얻을 :

  1. CustomViewClass의 인스턴스에 화면 ...
  2. ... 정확히 한명의 소유자와 그 슈퍼 뷰 ...
  3. ... 그리고 느긋하게 변수 (customButtonLocal은 블록이 끝난 직후에 해제됩니다).

그러나 이렇게하는 것이 "올바른"방법이 될 수 없습니다. 그래서, 결국, 내 질문 :

어떻게 나는 할당하고이 가운데 사람이 해결 방법을 사용하지 않고이 프로그램 생성 __weak 변수를 인스턴스화해야 ?

답변

2

CustomViewClass *customButton을 참조하십시오.

일반적으로 서브 뷰의 변수를 __weak IBOutlet으로 선언하는 이유는 이러한 링크가 소유권을 의미하지 않는다는 것입니다. 하위보기는 NIB/스토리 보드에서 인스턴스화 된 객체가 소유합니다. 당신은 그 객체를 직접 소유하고, 당신은 또한 그 종속 객체를 간접적으로 소유한다.

customButton은 프로그래밍 방식으로 생성하므로 사용자의 NIB/스토리 보드가 소유하지 않습니다. 따라서 참조 번호를 __strong (ARC 한정자가없는 경우 기본값)으로 지정해야합니다.

+0

의미가 있습니다. 감사! – ravron

+0

메모리 누수가 발생합니다. –

+0

@JonasAlves 더 구체적으로 말합니까? 특히 메모리 누수의 원인은 무엇입니까? 어떤 상황에서? 대답이 OP에 메모리 누수를 일으키지 않았 음이 100 % 확실하므로 설명에 진심으로 감사드립니다. – dasblinkenlight

관련 문제