programing

신규 대신 할당 사용

kakaobank 2023. 5. 2. 22:53
반응형

신규 대신 할당 사용

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/-init애플의 입장에서.NSObject실행.이것이 바뀔 가능성은 매우 낮지만, 당신의 편집증 수준에 따라, 애플의 문서는+new향후 구현 변경(및 동등성 깨짐)을 허용하는 것으로 보입니다.이러한 이유로, "명시적인 것이 암시적인 것보다 낫다" 그리고 역사적 연속성을 위해, 목표-C 공동체는 일반적으로 다음을 피합니다.+new그러나 일반적으로 Objective-C에 대한 최근 Java 사용자들의 끈질긴 사용을 확인할 수 있습니다.+new.

종종, 당신은 인수를 전달해야 할 것입니다.init그래서 당신은 다음과 같은 다른 방법을 사용하게 될 것입니다.[[SomeObject alloc] initWithString: @"Foo"]만약 여러분이 이것을 쓰는 것에 익숙하다면, 여러분은 이런 식으로 하는 것에 습관이 될 것입니다.[[SomeObject alloc] init]보다 자연스럽게 올 수도 있습니다.[SomeObject new].

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

  1. 둘 다 똑같아요.그렇지만
  2. 'new'는 기본 'init' 이니셜라이저에서만 작동하며 다른 이니셜라이저(예: initWithString:)에서는 작동하지 않습니다.

저는 이것에 매우 늦었지만 스위프트가 있는 Obj-C에서 새로운 것은 실제로 안전하지 않다는 것을 언급하고 싶습니다.Swift는 다른 이니셜라이저를 만들지 않는 경우에만 기본 init 메서드를 만듭니다.사용자 지정 이니셜라이저를 사용하여 swift 클래스에서 new를 호출하면 충돌이 발생합니다.alloc/init를 사용하면 컴파일러는 init가 존재하지 않는다고 적절하게 불평할 것입니다.

참고로, 저는 개인적으로.[Foo new]그 안에 있는 어떤 것을 아무 곳에서도 사용하지 않고 수행하기를 원한다면 그것의 반환 값.의 반환을 사용하지 않는 경우[[Foo alloc] init]어디든 경고를 받을 것입니다.어느 정도, 저는 사용합니다.[Foo new]눈요기용의

만약 새로운 것이 당신에게 도움이 된다면, 그것은 당신의 코드를 약간 더 작게 만들 것입니다.그렇지 않으면 전화를 걸겠습니다.[[SomeClass alloc] init]코드의 여러 위치에서 새로운 구현, 즉 objc 런타임에서 캐시 누락 횟수를 줄이는 핫스팟을 생성합니다.

에는 사용자 정의 이니셜라이저를 사용하는 것으로.[[SomeClass alloc] initCustom].

그렇지 않은 경우 사용[SomeClass new].

언급URL : https://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new

반응형