새로운 대신 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/-init
Apple의 NSObject
구현 과 동일합니다 . 이것이 변경 될 가능성은 거의 없지만, 편집증 수준에 따라, Apple의 문서 +new
는 향후 구현 변경 (및 동등성 중단)을 허용하는 것으로 보입니다. 이러한 이유로, "명시적인 것이 묵시적인 것보다 낫다"고 역사적 연속성을 위해 Objective-C 커뮤니티는 일반적으로 피 +new
합니다. 그러나 일반적으로 Objective-C에 대한 최신 자바 프로그램을 개를 사용하여 발견 할 수 있습니다 +new
.
종종 인수를 전달해야 init
하므로와 같은 다른 방법을 사용하게됩니다 [[SomeObject alloc] initWithString: @"Foo"]
. 이 글을 쓰는 데 익숙하다면 이런 식으로 습관을들이는 것이 [[SomeObject alloc] init]
더 자연 스럽습니다 [SomeObject new]
.
한 가지 짧은 답변은 다음과 같습니다.
- 둘 다 동일합니다. 그러나
- 'new'는 기본 'init'이니셜 라이저에서만 작동하며 다른 이니셜 라이저 (예 : initWithString :)에서는 작동하지 않습니다.
참고로, [Foo new]
어디에서나 반환 값을 사용하지 않고 init에 무언가를하고 싶다면 개인적으로 사용 합니다. [[Foo alloc] init]
어디에서든 반품을 사용하지 않으면 경고가 표시됩니다. 다소간, 나는 [Foo new]
눈 사탕에 사용 합니다.
나는 이것에 매우 늦었지만 Swift 세계가있는 Obj-C에서는 실제로 새로운 것이 안전하지 않다고 언급하고 싶습니다. 다른 초기화 프로그램을 만들지 않으면 Swift는 기본 init 메소드 만 만듭니다. 사용자 정의 이니셜 라이저를 사용하여 신속한 클래스에서 new를 호출하면 충돌이 발생합니다. alloc / init를 사용하면 컴파일러는 init가 존재하지 않는다고 올바르게 불평합니다.
새로운 것이 당신을 위해 일한다면, 그것은 또한 코드를 약간 작게 만듭니다. [[SomeClass alloc] init]
코드의 여러 곳에서 다른 방법으로 전화를 걸면 새로운 구현, 즉 objc 런타임에서 핫스팟을 만들어 캐시 누락 수를 줄일 수 있습니다.
내 이해에 따라 사용자 정의 초기화 프로그램을 사용해야하는 경우 [[SomeClass alloc] initCustom]
.
그렇지 않으면을 사용하십시오 [SomeClass new]
.
참고 URL : https://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new
'Programming' 카테고리의 다른 글
왜 대괄호를 사용하여 목록 초기화가 대안보다 낫습니까? (0) | 2020.03.03 |
---|---|
YAML에서 문자열에 대한 따옴표가 필요합니까? (0) | 2020.03.03 |
파일 경로에서 파일 디렉토리 경로 가져 오기 (0) | 2020.03.02 |
'with'문에 여러 변수가 있습니까? (0) | 2020.03.02 |
C #에서 목록의 첫 번째 N 요소를 얻는 방법은 무엇입니까? (0) | 2020.03.02 |