[objective-c] 새로운 대신 alloc init 사용

Objective-C를 배우고 샘플 코드를 읽으면 객체가 일반적 으로이 방법을 사용하여 생성됩니다.

SomeObject *myObject = [[SomeObject alloc] init];

대신에:

SomeObject *myObject = [SomeObject new];

그것들이 동등한 것을 읽었을 때 이것에 대한 이유가 있습니까?



답변

여기에 여러 가지 이유가 있습니다 : http://macresearch.org/difference-between-alloc-init-and-new

선택된 것들은 :

  • new커스텀 이니셜 라이저를 지원하지 않습니다 (예 initWithString🙂
  • alloc-init 보다 명백하다 new

일반적인 의견은 자신이 편한 것을 사용해야한다는 것입니다.


답변

아주 오래된 질문이지만 재미를 위해 몇 가지 예를 썼습니다. 아마도 유용 할 것입니다.)

#import "InitAllocNewTest.h"

@implementation InitAllocNewTest

+(id)alloc{
    NSLog(@"Allocating...");
    return [super alloc];
}

-(id)init{
    NSLog(@"Initializing...");
    return [super init];
}

@end

주요 기능에서 두 진술 :

[[InitAllocNewTest alloc] init];

[InitAllocNewTest new];

동일한 결과를 얻습니다.

2013-03-06 16:45:44.125 XMLTest[18370:207] Allocating...
2013-03-06 16:45:44.128 XMLTest[18370:207] Initializing...

답변

+new+alloc/-initApple의 NSObject구현 과 동일합니다 . 이것이 변경 될 가능성은 거의 없지만, 편집증 수준에 따라, Apple의 문서 +new는 향후 구현 변경 (및 동등성 중단)을 허용하는 것으로 보입니다. 이러한 이유로, “명시적인 것이 묵시적인 것보다 낫다”고 역사적 연속성을 위해 Objective-C 커뮤니티는 일반적으로 피 +new합니다. 그러나 일반적으로 Objective-C에 대한 최근의 자바 사용은 그들의 독단적 인 사용을 통해 확인할 수 +new있습니다.


답변

종종 인수를 전달해야 init하므로와 같은 다른 방법을 사용하게됩니다 [[SomeObject alloc] initWithString: @"Foo"]. 이 글을 쓰는 데 익숙하다면 이런 식으로 습관을들이는 것이 [[SomeObject alloc] init]더 자연 스럽습니다 [SomeObject new].


답변

한 가지 짧은 답변은 다음과 같습니다.

  1. 둘 다 동일합니다. 그러나
  2. ‘new’는 기본 ‘init’이니셜 라이저에서만 작동하며 다른 이니셜 라이저 (예 : initWithString :)에서는 작동하지 않습니다.

답변

참고로, [Foo new]어디에서나 반환 값을 사용하지 않고 init에 무언가를하고 싶다면 개인적으로 사용 합니다. [[Foo alloc] init]어디에서든 반품을 사용하지 않으면 경고가 표시됩니다. 다소간, 나는 [Foo new]눈 사탕에 사용 합니다.


답변

나는 이것에 매우 늦었지만 Swift 세계가있는 Obj-C에서는 실제로 새로운 것이 안전하지 않다고 언급하고 싶습니다. 다른 초기화 프로그램을 만들지 않으면 Swift는 기본 init 메소드 만 만듭니다. 사용자 정의 이니셜 라이저를 사용하여 신속한 클래스에서 새로 전화하면 충돌이 발생합니다. alloc / init를 사용하면 컴파일러는 init가 존재하지 않는다고 올바르게 불평합니다.