2013-01-07 3 views
3

현재 책과 온라인 자습서를 읽거나 Apple 설명서를 참조하여 Objective-C를 배우려고하고 있지만 클릭하지 마십시오. 클래스에 대한 질문이 있는데, 사용 방법에 너무 많은주의를 기울이지 않고 잠시 동안 NSString을 사용하고 있습니다.Objective-C의 인스턴스화에 대해 이해

나는

다음
ClasssName *varName = [[ClassName alloc]init]; 

당신이 부를 것이다 ... 위해 누군가가 같은 것을 먼저 인스턴스화하는 데 필요한 목표 - C에서 특정 클래스에서 메서드를 사용할 수 있도록하기위한 인상의 아래에 있었다 같은 방법은 ...

[varName someMethod]; 

그러나

합니다 ...있는 NSString 내가 예를 들어 여기에 우리가 일반적으로 사용하는 것이 방법이다, 지금은 조금 혼란 스러워요 사용하는 방법을 찾고

NSString *someString = @"some text here"; 
[someString stringByAppendingFormat: @"some text = %d", 3]; 

수업에 관해 읽은 다음에 다음과 같이해야합니다. 일부 클래스는 방법을 사용하기 전에 인스턴스를 필요로하지 않는 이유

NSString *someString = [[NSString alloc]initWithString: @"some text here"]; 
[someString stringByAppendingFormat: @"some text = %d", 3]; 

누군가는 설명 할 수 있습니까?

답변

7

Objective-C는 리터럴이라고하는 몇 가지 약어를 알고 있습니다. 컴파일러는 특수 표기법을 알고 있습니다. 문자열 리터럴은 이진 파일로 컴파일되고 앱의 수명 내내 종료됩니다.

대부분의 경우 런타임시 생성되는 개체처럼 동작합니다.

  • 두 리터럴이 동일한 경우, 하나의 객체가 생성되고 이전에 리터럴로 사용되는 @"My String"으로 NSString *string = [[NSString alloc] initWithString:@"My String"];을 만들 경우 영원히
  • 을 살고, 또한 string가 가리킬 수 있습니다.

Apple LLVM 컴파일러 4.0 Objective-C는 (는) more literals을 알고 있습니다. 그러나 문자열 리터럴과 달리 이러한 리터럴은 편리한 초기화 프로그램을 통해 런타임 중에 작성됩니다.

[someString stringByAppendingFormat: @"some text = %d", 3]; 

가 someString을 변경하지 않는


참고. 새 문자열 객체를 반환합니다.

NSString *newString = [someString stringByAppendingFormat: @"some text = %d", 3]; 
+1

문자열 리터럴 만 이진 파일로 컴파일됩니다. 새로운 객체 리터럴 (NSNumber, 사전 및 배열)은 기존의 편리한 생성자를 사용하여 런타임 중에 빌드되는 인스턴스를 만듭니다. –

+1

동일한 인스턴스 제거는 컴파일러에서 보장하지 않는 최적화입니다. 두 개의 컴파일 단위가 서로 다른 인스턴스를 가질 수 있습니다. –

+1

컴파일러는 일반 인스턴스를 리터럴 인스턴스화로 변환하지 않습니다. –

5

@"Text" 구문은이 속기로 생각 될 수있다, 다시 당신에게 오토 릴리즈 문자열을 제공합니다.

당신이

[[NSString alloc]initWithString: @”some text here”]; 

당신이 개념적으로 @”some text here”와 함께 오토 릴리즈 캐릭터를 만들 작성하고 다음 initWithString으로 유지 새로운 캐릭터를 만들 때.

+3

실제로 자동 출시되지 않았습니다. 얼마나 많은 릴리즈 메시지를 수신하더라도 상관없이 결코 할당을 해제 할 수 없습니다. –

+1

@NikolaiRuhe가 말한 것은 사실이지만 구현의 세부 사항이기도합니다. '@ ""표기법에서 반환 된 문자열은 자동 완성으로 처리해야합니다. – kubi

+0

좋은 정보를 보내 주셔서 감사합니다. –

관련 문제