본문 바로가기

프로그래밍/iOS

new VS alloc init

  1. new
    - alloc init의 단축 명령으로 객체를 메모리에 할당하고 초기화 하는 메소드까지 한번에 호출
    - 인자를 사용하는 초기화 메소드(initWith-)의 사용이 필요한 경우에는 대체 불가
  2. // 같은 역할을 함.
    NSObject *object = [NSObject new];
    NSObject *object = [[NSObject alloc] init];
    
    // initWithFrame은 new가 대체할 수 없음.
    UIView *myView = [UIView alloc] initWithFrame:CGRectZero];
    


  3. alloc init
    - alloc은 객체를 메모리에 할당하는 역할
    - init은 메모리에 할당한 객체를 초기화 하는 역할
    - (init-) 메소드는 메모리가 할당된 자기 자신을 없애고 새로운 객체를 만들 수 있으므로 alloc 뒤에 바로 사용.
  4. // 좋은 사용법
    NSObject *goodObject = [[NSObject alloc] init];
    
    // 나쁜 사용법
    NSObject *badObject = [NSObject alloc];
    [badObject init];  // init을 따로 사용할 경우 badObject가 가르키는 객체를 없애고 새로운 객체를 만들 수 있음.
    [badObject sendMessage]; // 그에 따라 badObject가 가르키는 객체가 유효하지 않을 수 있음.
    


  5. [NSArray array-] VS [[NSArray alloc] init]
    - [NSArray array-]: 초기화 시 autorelease된 객체로 초기화(NSString, NSDictionary 등도 마찬가지)
    - [[NSArray alloc] init] : 그냥 메모리 할당 및 초기화
  6. // autorelease 된 객체로 초기화.
    NSArray *myArr = [NSArray array];
    NSString *myStr = [NSString string];
    NSDictionary *myDic = [NSDictionary dictionary];
    
    // 메소드는 이런식으로 만들어져 있을 것 같음.
    - (NSArray *)array {
        return [[[NSArray alloc] init] autorelease];
    }
    



'프로그래밍 > iOS' 카테고리의 다른 글

NSAutoreleasePool VS @autorelease block  (0) 2017.04.10
iOS 식별자(identifier)  (2) 2017.04.07
NSURL의 속성  (0) 2017.04.07
nil, Nil, null, NSNull의 차이  (0) 2017.04.06
frame VS bounds  (5) 2017.04.04