2017-05-03 14 views
0

ARC에서 부모보기 및 배열에 추가 된 사용자 지정보기를 릴리스하고 싶습니다.UIView는 어떻게 출시 될 예정입니까? 설명

CustomView* newView; 
newView = [[CustomView alloc] init]; 
[panelScroll addSubview:newView]; 
[self.medsSectionViews addObject:newView]; 
newView = nil; 

그 개체를 해제하지 : 위

@property (nonatomic, weak) IBOutlet UIScrollView* panelScroll; 
@property (nonatomic, retain) NSMutableArray *medsSectionViews; 

가있는 CustomView 객체 이하로 첨가되는 두 가지 속성이다. 문제가 무엇입니까? 그것을 어떻게 성취 할 수 있습니까? 참조 횟수를 요구 사항에 명시하십시오.

+1

-addSubview :와 배열이 유지하므로 newView가 출시되지 않습니다. – Aris

+0

뷰는 두 개의 객체가 소유합니다. 이 두 객체 (배열 및 수퍼 뷰)가 사용을 중지 할 때까지는 해제 할 수 없습니다. 그건 그렇고, 당신의 코드는'retain'을 사용해서는 안됩니다. 'strong'을 사용해야합니다. – Sulthan

답변

1
CustomView *newView = [[CustomView alloc] init]; // 1 owner (the newView local variable) 
[panelScroll addSubview:newView]; // 2 owners (local variable, the superview panelScroll) 
[self.medsSectionViews addObject:newView]; // 3 owners (local variable, superview, array medsSectionViews) 
newView = nil; // 2 owners (superview, array) 

지금

[array removeAllObjects]; // 1 owner (superview) 
[newView removeFromSuperview]; // 0 owners 
// view gets deallocated because it has no owners 
0

어떤 방법이 유지됩니다 개체 : 코드에서

: 1. addSubview : 2. addObject :

보기를 유지;

그래서 필요하면 [array removeAllObjects]; [newView removeFromSuperview];

왜 newView = nil에서보기를 해제 할 수 있습니까? ARC에서 사용하기 때문에 관리 개체 수명주기에 대한 참조.

0

귀하의 newView 변수가 로컬 변수 인 것으로 보입니다. 그것이 범위를 벗어나 자마자 그것은 당신의 견해에 대한 강한 참고 자료를 공개 할 것입니다. 따라서 당신은 그것을 실제로 아무것도 설정하지 않아도됩니다.

  1. 배열은 그 내용에 강한 참조를 유지 :

    는 당신이 다른 강한 참조가 있습니다.
  2. 수퍼 뷰에보기를 추가하면 수퍼 뷰는 강력한 참조를 보유합니다.

출시하려면 배열에서 제거하고 슈퍼 뷰에서 제거해야합니다. 할당이 취소됩니다.