IOS UIView 라이프 사이클의 인스턴스 상세 정보

3324 단어
IOS UIView 라이프 사이클의 인스턴스 상세 정보
모든 대상자는 하나의 생명 주기가 있는데, 즉, 모두 실례화되어 소각되는 과정이 존재한다.
UIView 대상도 예외가 아니다. 그렇다면 UIView는 init/new에서 시작한 후 dealloc가 끝날 때까지 어떤 과정을 거쳤을까?
먼저 UIView에서 상속된 객체 LifeView를 사용자화합니다.

#import  
 
@interface LifeView : UIView 
 
@end 

#import "LifeView.h" 
 
@interface LifeView () 
{ 
  NSInteger count; 
} 
 
@end 
 
@implementation LifeView 
 
- (instancetype)initWithFrame:(CGRect)frame 
{ 
  self = [super initWithFrame:frame]; 
  if (self) 
  { 
    NSLog(@"", __func__, @(count++)); 
  } 
  return self; 
} 
 
 
- (void)willMoveToSuperview:(nullable UIView *)newSuperview 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
- (void)didMoveToSuperview 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
- (void)willMoveToWindow:(nullable UIWindow *)newWindow 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
- (void)didMoveToWindow 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
- (void)layoutSubviews 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
- (void)removeFromSuperview 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
- (void)dealloc 
{ 
  NSLog(@"", __func__, @(count++)); 
} 
 
@end 

그 다음에 B 보기 컨트롤러에서 실례화하고 부모 보기에 추가합니다

- (void)viewDidLoad { 
  [super viewDidLoad]; 
  // Do any additional setup after loading the view. 
   
  self.title = @"life view"; 
   
  LifeView *lifeView = [[LifeView alloc] initWithFrame:CGRectMake(10.0, 80.0, 100.0, 100.0)]; 
  [self.view addSubview:lifeView]; 
  lifeView.tag = 1000; 
  lifeView.backgroundColor = [UIColor orangeColor]; 
} 


B 뷰 컨트롤러가 push 또는 present로 표시될 때 호출되는 LifeView와 관련된 방법은 다음과 같습니다.

//   
2017-06-16 00:37:10.694 DemoViewLife[3963:121184]  
2017-06-16 00:37:10.695 DemoViewLife[3963:121184]  
2017-06-16 00:37:10.695 DemoViewLife[3963:121184]  
2017-06-16 00:37:10.697 DemoViewLife[3963:121184]  
2017-06-16 00:37:10.697 DemoViewLife[3963:121184]  
2017-06-16 00:37:10.701 DemoViewLife[3963:121184]  

B 뷰 컨트롤러가 pop 또는 dismiss일 때 호출되는 LifeView와 관련된 방법은 다음과 같습니다.

//   
2017-06-16 00:37:25.514 DemoViewLife[3963:121184]  
2017-06-16 00:37:25.514 DemoViewLife[3963:121184]  
2017-06-16 00:37:25.515 DemoViewLife[3963:121184]  
2017-06-16 00:37:25.516 DemoViewLife[3963:121184]  
2017-06-16 00:37:25.518 DemoViewLife[3963:121184]  

인쇄 정보에서 볼 수 있는 방법인'removeFrom Superview'가 두 번 호출되었는데 이것은 B 보기 컨트롤러에서 이 방법을 주동적으로 호출했기 때문이다.이 방법을 주동적으로 사용하지 않으면 한 번만 호출된다.
또 두 번 실행된 방법으로는'will Move Towindow'와'did Move Towindow'가 있다.new Window가 존재할 때, 실례화 생성이 처음 호출되는 것을 잘 구분할 수 있습니다.new Window가 nil일 때, 삭제됩니다. 즉, 생명주기가 끝납니다.
궁금한 점이 있으면 댓글을 남기거나 본 사이트 지역사회에 가서 토론을 교류하고 읽어주셔서 감사합니다. 여러분께 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기