본문 바로가기

교육/iOS

[iOS] init

1. init 함수

- NSObject 자식 일반 클래스 : init

- viewController : [[MyVC alloc] initWithNibName] 생성

GUI 클래스 

=>코드로 생성 : [[MyView alloc] initWithFrame:rc];

=>xib 생성 : [[MyView alloc] initWithCoder] 초기화


2. 샘플 코드

ViewController.xib의 뷰를 MyView로 설정하고 MyView에 아래 코드 작성 

@implementation MyView

-(instancetype)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self)

    {

        str=@"hello";

        NSLog(@"MyView : %s",__FUNCTION__);

    }

    return self;

}

-(instancetype)initWithCoder:(NSCoder *)aDecoder

{

    self = [super initWithCoder:aDecoder];

    if (self)

    {

        str=@"hello";

        NSLog(@"MyView : %s",__FUNCTION__);

    }

    return self;

}


- (void)drawRect:(CGRect)rect

{


    // 글씨 화면 출력

    [str drawAtPoint:CGPointMake(10, 10) withAttributes:nil];

}



@end


3. 객체가 로드되는 시점

initWithNibName : 뷰가 아직 로드되지 않음

loadView : 뷰가 로드됌, view 필요할때 함수가 호출되고 여기서 view 로드, 코딩으로 컨트롤러로 만들때만 호출, xib 만들면 불리지 않는다.

awakeFromNib : Xib와 코드의 객체들이 연결작업 한 후 호출 됌

self.view라고 호출해 버리면 이미 지연된 초기화로 생성한 후라 보임


4. 샘플코드

뷰 컨트롤러에 아래 코드 작성

@interface ViewController ()


@end


@implementation ViewController

// view 필요할때 함수가 호출되고 여기서 view 로드

-(void)loadView

{

    NSLog(@"vc %s 1", __FUNCTION__);


    [super loadView]; // xib load

    NSLog(@"vc %s 2", __FUNCTION__);

}

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

//    NSLog(@"vc : %s 1 %p",__FUNCTION__,self.view); // xib이름 모르는데 어떻게 로드? xib이름이 없으면 자기랑 동일 이름 호출

    

    NSLog(@"vc : %s 1 %p",__FUNCTION__,self.viewIfLoaded);// 뷰가 로드된 경우만 포인터 반환

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

//        NSLog(@"vc : %s 2",__FUNCTION__); // 순간 뷰는 만들어져 있지 않다.

//        NSLog(@"vc : %s 2 %p",__FUNCTION__,self.view); // self.view하는 순간 만들어져있다. 지연된 초기화

        NSLog(@"vc : %s 2 %p",__FUNCTION__,self.viewIfLoaded);

    }

    return self;

}

- (void)viewDidLoad {

    [super viewDidLoad];

    

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    

}


@end


3번의 마이 뷰에 아래 코드 작성

@implementation MyView

// view 생성되고 모든 outlet변수, 액션등이 초기화 호출

// 연결이 끝난 다음에 불림, 매뉴얼(부모 먼저, 해제할때만 부모 나중, templet메소드 패턴)

-(void)awakeFromNib

{

    NSLog(@"v %s 1",__FUNCTION__);

    NSLog(@"MyView : %s Label %p 1",__FUNCTION__,_label);

    [super awakeFromNib];

    NSLog(@"v %s 2",__FUNCTION__);

    NSLog(@"MyView : %s Label %p 2",__FUNCTION__,_label);

}

-(instancetype)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self)

    {

        str=@"hello";

        NSLog(@"MyView : %s",__FUNCTION__);

    }

    return self;

}

-(instancetype)initWithCoder:(NSCoder *)aDecoder

{

    self = [super initWithCoder:aDecoder];

    if (self)

    {

        str=@"hello";

        NSLog(@"MyView : %s",__FUNCTION__);

        NSLog(@"MyView : %s Label %p",__FUNCTION__,_label);

    }

    return self;

}


- (void)drawRect:(CGRect)rect

{

  

    // 글씨 화면 출력

    [str drawAtPoint:CGPointMake(10, 10) withAttributes:nil];

}



@end


'교육 > iOS' 카테고리의 다른 글

[iOS] voice over 설정  (0) 2017.06.23
[iOS] 키보드 내리는 버튼 추가  (0) 2017.03.06
[iOS] xib와 strong, weak  (0) 2016.08.03
[iOS] Xib  (0) 2016.08.01
[iOS] 눈내리는 애니메이션 만들기  (0) 2016.08.01