여기 내 상황입니다 :보기 컨트롤러에 서브 뷰에 대한 링크를 유지
이보기는 .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
그런 식으로, 내가 원하는 것을 얻을 :
- CustomViewClass의 인스턴스에 화면 ...
- ... 정확히 한명의 소유자와 그 슈퍼 뷰 ...
- ... 그리고 느긋하게 변수 (customButtonLocal은 블록이 끝난 직후에 해제됩니다).
그러나 이렇게하는 것이 "올바른"방법이 될 수 없습니다. 그래서, 결국, 내 질문 :
어떻게 나는 할당하고이 가운데 사람이 해결 방법을 사용하지 않고이 프로그램 생성 __weak
변수를 인스턴스화해야 ?
의미가 있습니다. 감사! – ravron
메모리 누수가 발생합니다. –
@JonasAlves 더 구체적으로 말합니까? 특히 메모리 누수의 원인은 무엇입니까? 어떤 상황에서? 대답이 OP에 메모리 누수를 일으키지 않았 음이 100 % 확실하므로 설명에 진심으로 감사드립니다. – dasblinkenlight