Objective-C를 배우고 샘플 코드를 읽으면 객체가 일반적 으로이 방법을 사용하여 생성됩니다.
SomeObject *myObject = [[SomeObject alloc] init];
대신에:
SomeObject *myObject = [SomeObject new];
그것들이 동등한 것을 읽었을 때 이것에 대한 이유가 있습니까?
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
일반적인 의견은 자신이 편한 것을 사용해야한다는 것입니다.
+newWithString:
이미 구현 한 경우 구현 을 방해하는 것은 없습니다 -initWithString
. 그래도 흔한 일은 아닙니다. 개인적으로 나는 new
지정된 초기화 프로그램이 항상 init
짧고 달콤 할 때 사용 합니다 .
+newWithString:
. 그것은 우려의 분리를 깨뜨립니다. -init
어쨌든 사용하고 싶을 때만을 사용 하지 않는 이유는 없습니다 +new
.
[[NSString alloc] initWithFormat:...]
와 [NSString stringWithFormat:...]
모두 동일하다. 당신은 애플이 우려의 분리를 위반했다고 말하고 있습니까? 이런 식으로 구현해서는 안됩니까? (참고 : 나는
아주 오래된 질문이지만 재미를 위해 몇 가지 예를 썼습니다. 아마도 유용 할 것입니다.)
#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...
[[InitAllocNewTest alloc] init]
않으면 @end 가 컴파일되지 [InitAllocNewTest new]
않습니다. (줄 바꿈 등이없는 것에 대한 사과)
+new
+alloc/-init
Apple의 NSObject
구현 과 동일합니다 . 이것이 변경 될 가능성은 거의 없지만, 편집증 수준에 따라, Apple의 문서 +new
는 향후 구현 변경 (및 동등성 중단)을 허용하는 것으로 보입니다. 이러한 이유로, "명시적인 것이 묵시적인 것보다 낫다"고 역사적 연속성을 위해 Objective-C 커뮤니티는 일반적으로 피 +new
합니다. 그러나 일반적으로 Objective-C에 대한 최근의 자바 사용은 그들의 독단적 인 사용을 통해 확인할 수 +new
있습니다.
+new
NeXT 시절부터 주변에 있었기 때문에 이것을 하향 투표했습니다 . +new
오래 전에 objc를 배운 사람의 표시 라면 무엇 인가? 나는 언어에 익숙해 지거나 수년 동안 글을 썼지 만 iOS 붐 이후 분명하게 많은 사람들이 무슨 +new
의미 인지 알지 못합니다 . 둘째, +new
매우 오래되고 NeXT 시절부터 애플은 오래된 코드를 깨뜨리는 방식으로 그것을 바꾸는 것이 미쳤습니다. 특히 자체 코드베이스가 아마도 어지럽다는 것을 고려할 때.
new
관용구가 스몰 토크에서 온 것이라고 확신합니다 . Ruby에서도 사용되며 Objective-C와 Ruby는 모두 Smalltalk에서 구문과 규칙을 많이 파생시킵니다.
새로운 것이 당신을 위해 일한다면, 그것은 또한 코드를 약간 작게 만듭니다. [[SomeClass alloc] init]
코드의 여러 곳에서 다른 방법으로 전화를 걸면 새로운 구현, 즉 objc 런타임에 핫스팟을 만들어 캐시 누락 수를 줄일 수 있습니다.
내 이해에 따라 사용자 정의 초기화 프로그램을 사용해야하는 경우 [[SomeClass alloc] initCustom]
.
그렇지 않으면을 사용하십시오 [SomeClass new]
.
init
기능을 재정의 하고 사용하십시오. [[SomeClass alloc] init];
매개 변수가 필요한 경우 여전히 그렇게하지 마십시오 [[SomeClass alloc] initWith:...];
. 마지막으로, init
커스텀 구현으로 함수 를 재정의하면 new
객체를 만들 때 호출 할 수 있으며 여전히 커스텀 init
구현을 호출합니다 .