Objective-C 기본 구문 빠른 시작 (1)

13846 단어 토대먼저 오다

메소드 호출(Calling Methods)


가능한 한 빨리 착수할 수 있도록, 우리는 먼저 몇 가지 간단한 예를 보았다.Objective-C 구문의 기본 메서드 호출은 다음과 같습니다.

  
  
  
  
  1. [object method];  
  2.  
  3. [object methodWithInput:input];  
  4.  

객체 메서드는 값을 반환합니다.

  
  
  
  
  1. output = [object methodWithOutput];  
  2.  
  3. output = [object methodWithInputAndOutput:input];  
  4.  

우리도 클래스에서 대상을 만드는 방법을 호출할 수 있다.다음 예에서는 NSString 클래스의 string 메서드를 사용합니다.

  
  
  
  
  1. id myObject = [NSString string];  
  2.  

id 유형은 myObject라는 변수가 모든 유형의 변수를 가리킬 수 있음을 의미합니다.우리가 이 프로그램을 컴파일할 때, 그가 실현한 진실한 종류와 방법을 전혀 모른다.
이 예에서 분명히 이 대상의 유형은 NSString이어야 하기 때문에 우리는 그의 유형을 바꿀 수 있다.

  
  
  
  
  1. NSString* myString = [NSString string];  
  2.  

이제 myString은 NSString 유형의 변수입니다.이때 만약 우리가 NSString이 실현되지 않은 방법을 사용하려고 시도한다면 컴파일러는 우리에게 경고할 것이다.
대상 유형의 오른쪽에 별표가 있다는 것을 반드시 주의해야 한다.모든 Objective-C 객체 변수는 포인터 유형입니다.id 형식은 바늘 형식으로 미리 정의되었습니다.그래서 우리는 별표를 더 넣을 필요가 없다.

메시지 호출 중첩(Nested Messages)


여러 프로그래밍 언어에 메시지를 중첩하거나 중첩 함수는 다음과 같이 보입니다.

  
  
  
  
  1. function1 ( function2() );  

function2의 반환값은function1에 입력 매개 변수로 전달됩니다.Objective-C에서 중첩된 메시지 호출은 다음과 같습니다.

  
  
  
  
  1. [NSString stringWithFormat:[prefs format]];  

우리는 가능한 한 한 한 줄 코드 안에 두 개 이상의 호출을 끼워 넣는 것을 피해야 한다.이러면 코드의 가독성이 좋지 않기 때문이다.
 

다중 참조 입력 방법(Multi-Input Methods)


매개 변수를 여러 개 입력하는 방법.Objective-C에서 하나의 방법명은 몇 단락으로 분할될 수 있습니다.헤더 파일에서 이렇게 여러 입력 매개변수를 정의하는 방법을 정의해야 합니다.

  
  
  
  
  1. -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;  
  2.  

우리는 이렇게 그것을 호출한다.

  
  
  
  
  1. BOOL result = [myData writeToFile:@"/tmp/log.txt" atomically:NO];  
  2.  

매개 변수는 반드시 그것에 이름을 붙여야 하는 것은 아니다.운행기 시스템에서 이 방법의 실제 이름은 write ToFile:atomically: 입니다.

  
  
  
  
  1. Accessors(Getter & Setter)  
  2.  

Objective-C의 모든 실례 대상은 기본적으로 사유입니다.대부분의 경우 변수의 값을 읽거나 설정하려면accessors를 사용해야 합니다.두 가지 문법이 모두 이런 조작을 지원하는데 이때 전통적인 문법은 다음과 같다.

  
  
  
  
  1. [photo setCaption:@"Day at the Beach"];  
  2. output = [photo caption];  
  3.  

두 번째 줄의 코드는 사실 대상의 실례를 직접 읽는 변수가 아니다.사실 그것은 캡션이라는 방법을 사용했다.Objective-C에서 대부분의 경우 getters에 get의 접두사를 붙일 필요가 없습니다.
언제든지 우리는 네모난 괄호를 볼 수 있지만, 사실 우리는 한 대상이나 클래스에 메시지를 보낸다.
 

Dot Syntax


Objective-C 2.0에 "."가 새로 추가되었습니다.조작의 문법.Mac OS X 10.5에는 Objective-C 2.0 구문이 사용됩니다.

  
  
  
  
  1. photo.caption = @"Day at the Beach";  
  2. output = photo.caption;  
  3.  

우리는 두 가지 방식을 모두 사용할 수 있다.그러나 한 공정에서 스타일링을 일치시키고 하나만 사용하는 것이 좋다."."동작은 setters와 getters에만 사용할 수 있으며 일반적인 의미의 방법에는 사용할 수 없습니다.

객체 작성


주로 두 가지 방식으로 대상을 만들 수 있다.첫 번째 방법은 다음과 같다.

  
  
  
  
  1. NSString* myString = [NSString string];  
  2.  

이것은 매우 관성적인 풍격이다.이러한 상황에서, 우리는 시스템이 자동으로 방출하는 (autoreleased) 유형의 대상을 만듭니다.자동 방출 유형autoreleased에 관해서는 나중에 깊이 있게 토론할 것입니다.그러나 많은 경우에 우리는 수동으로 대상을 만들어야 한다.

  
  
  
  
  1. NSString* myString = [[NSString alloc] init];  
  2.  

이것은 끼워 넣는 방법으로 호출된다.NSString 자체 alloc 메서드를 처음 호출했습니다.이것은 상대적으로 밑바닥을 비교하는 호출이다. 왜냐하면 그는 내용을 만들고 대상을 실례화했기 때문이다.
두 번째 코드는 새로 만든 대상의 init 방법을 호출했습니다.이 init 방법은 실례 대상을 만드는 매개 변수와 같은 비교적 자주 사용하는 기본 설정을 실현했다.일반 개발자에게 이 고객을 실현하는 유형의 구체적인 세부 사항은 분명하지 않다.
일부 상황에서 우리는 통하지 않는 초기화 방식으로 초치를 부여할 수 있다.

  
  
  
  
  1. NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];  
  2.  

기본 메모리 관리


만일 Mac OS X를 위한 애플리케이션을 개발하고 있다면 스팸 수거 메커니즘을 사용할지 여부를 선택할 수 있습니다.이것은 우리가 메모리 관리를 고려할 필요가 없다는 것을 의미한다. 특히 복잡한 상황을 제외하고는 우리가 처리해야 한다.
그러나 우리는 때때로 우리의 개발 환경에 쓰레기 회수 메커니즘이 없다. 예를 들어 아이폰을 개발할 때 쓰레기 회수 메커니즘이 없다.이런 상황에서 우리는 기본적인 메모리 관리 방면의 개념을 이해해야 한다.
만약 우리가 수동으로 alloc를 통해 대상을 만들었다면, 이 대상을 다 사용한 후에release가 그것을 사용해야 합니다.우리는releaseautoreleased 형식의 대상을 수동으로 제거할 필요가 없습니다. 만약 정말 이렇게 한다면, 우리 프로그램은crash를 사용할 것입니다.
여기에는 두 가지 예가 있다.

  
  
  
  
  1. // string1 will be released automatically  
  2.  
  3. NSString* string1 = [NSString string];  
  4.  
  5. // must release this when done  
  6.  
  7. NSString* string2 = [[NSString alloc] init];  
  8.  
  9. [string2 release];  
  10.  

이 강좌에서 우리는 autoreleased 대상을 위해 현재 함수 방법을 호출한 후에 방출할 수 있다.
물론 메모리 관리에 관한 많은 것들은 우리가 배워야 할 뿐이지만, 이것은 우리가 더 많은 기본 개념을 알고 나서야 언급할 수 있다.
 

클래스 Interface 설계


Objective-C 언어로 클래스를 만드는 것은 매우 간단합니다.그것은 매우 전형적으로 두 부분으로 나뉘었다.
클래스 인터페이스는 일반적으로 ClassName에 저장됩니다.h 파일에서 실례적인 매개 변수와 공개적인 방법을 정의합니다.
클래스 구현은 ClassName에서 수행됩니다.서류에그것은 진정으로 실행되는 코드와 그 방법들을 포함하고 있다.그것은 또한 자주 개인적인 방법을 정의한다.이런 개인적인 방법은 자류에 대해서는 볼 수 없다.
여기에 인터페이스 파일의 대략적인 것이 있다.클래스 이름은 포토이기 때문에 파일 이름은 포토입니다.h:

  
  
  
  
  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. @end  
  12.  

우선, 우리는 코코아를himport 들어와.코코아 애플리케이션의 모든 기본 클래스는 대부분 이렇게 만듭니다. #import 매크로 명령은 같은 파일을 여러 번 포함하는 것을 자동으로 피합니다.
@interface 기호는 Photo 클래스의 선언임을 나타냅니다.사칭은 부류를 지정했다.위의 예에서는 상위 클래스가 NSObject입니다.
큰 괄호 안에는 두 가지 변수가 있는데 그것이 바로caption과 포토grapher이다.둘 다 NSString 유형입니다.물론, 그들도 id 유형을 포함한 모든 종류가 될 수 있습니다.
마지막으로 @end에서 모든 성명을 끝냅니다.

증가 방법


구성원 변수에 Getters:

  
  
  
  
  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - caption;  
  12.  
  13. - photographer;  
  14.  
  15. @end  
  16.  

Objective-C 방법은 get 접두사를 붙일 필요가 없다는 것을 잊지 마세요.하나의 단독 작은 가로대는 그것이 실례적인 방법이라는 것을 나타낸다.만약 더하기 부호가 있다면 그것은 그것이 같은 종류의 방법이라는 것을 설명한다.
컴파일러의 기본 방법의 반환 형식은 id입니다.그리고 모든 방법의 매개 변수의 기본 형식도 id 형식입니다.그래서 위의 코드는 기술적으로 말하면 옳다.하지만 이렇게 쓰는 경우는 드물다.우리는 그것에 되돌아오는 유형을 추가하는 것이 좋겠다.

  
  
  
  
  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - (NSString*) caption;  
  12.  
  13. - (NSString*) photographer;  
  14.  
  15. @end  
  16.  

다음은 setters를 추가합니다.

  
  
  
  
  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - (NSString*) caption;  
  12.  
  13. - (NSString*) photographer;  
  14.  
  15. - (void) setCaption: (NSString*)input;  
  16.  
  17. - (void) setPhotographer: (NSString*)input;  
  18.  
  19. @end  
  20.  

Setters는 어떤 값도 되돌려줄 필요가 없기 때문에, 그 종류를void로 지정합니다.
 

유형의 실현


Getters 구현을 통해 클래스 구현을 만듭니다.

  
  
  
  
  1. #import "Photo.h"  
  2.  
  3. @implementation Photo  
  4.  
  5. - (NSString*) caption {  
  6.  
  7. return caption;  
  8.  
  9. }  
  10.  
  11. - (NSString*) photographer {  
  12.  
  13. return photographer;  
  14.  
  15. }  
  16.  
  17. @end  
  18.  

이 부분의 코드는 @implementation에서 클래스 이름을 추가하여 시작하여 @end로 끝납니다.클래스의 인터페이스 정의와 같이 모든 방법은 인터페이스 정의와 같다.모든 대상은 정의도 이루어져야 한다.
만약 우리가 이전에도 코드를 쓴 적이 있다면, Objective-C 안의 Getters는 다른 것과 차이가 많지 않을 것 같다.그래서 우리는 다음에 setters를 소개할 것이다. 그것은 약간의 설명이 필요하다.

  
  
  
  
  1. - (void) setCaption: (NSString*)input  
  2.  
  3. {  
  4.  
  5. [caption autorelease];  
  6.  
  7. caption = [input retain];  
  8.  
  9. }  
  10.  
  11. - (void) setPhotographer: (NSString*)input  
  12.  
  13. {  
  14.  
  15. [photographer autorelease];  
  16.  
  17. photographer = [input retain];  
  18.  
  19. }  
  20.  

각setter는 두 개의 변수를 처리합니다.첫 번째는 현재 존재하는 대상의 응용이다.두 번째는 새로운 입력 대상이다.쓰레기 수거를 지원하는 개발 환경에서 우리는 직접 새로운 값을 부여하기만 하면 된다.

  
  
  
  
  1. - (void) setCaption: (NSString*)input {  
  2.  
  3. caption = input;  
  4.  
  5. }  
  6.  

그러나 만약 우리가 쓰레기 회수 메커니즘을 사용할 수 없다면, 우리는 먼저 레틴의 낡은 대상을 사용하고, 그 다음에 레틴의 새로운 대상을 사용해야 한다.
인용 대상을 방출할 수 있는 두 가지 방법이 있습니다:release와 autorelease.표준release는 인용을 직접 삭제합니다.autorelease 방법은 장래의 어느 때release에 갈 것이다.그것의 성명 주기가 끝나기 전에, 그것은 의심할 여지없이 존재할 것이다.이 예에서 위 setPhotographer의 포토grapher 대상은 함수가 끝날 때 방출됩니다.
setter에서 autorelease를 사용하는 것은 안전합니다. 왜냐하면 새로운 대상과 오래된 대상은 같은 대상일 수도 있고 가리키는 대상은 같은 대상일 수도 있기 때문입니다.우리가 곧retain을 할 대상에 대해, 우리는 즉각적으로release를 사용해서는 안 된다.
이것은 지금 곤혹스러워 보일지 모르지만, 우리가 공부하면서 점점 더 그것을 이해할 수 있을 것이다.지금 우리는 즉시 그것을 완전히 이해할 필요가 없다.
 

 


 
 
 
 

좋은 웹페이지 즐겨찾기