목표-C

Objective-C
목표-C
가족C
설계자러브와 브래드 콕스
처음 등장한1984년, 38년(연방)
안정된 릴리스
2.0[1]
타이핑 분야정적, 동적, 취약
OS크로스 플랫폼
파일 이름 확장자.h, .m, .mm, .M
웹 사이트developer.apple.com
주요 구현
클랭, GCC
영향을 받다
C, Smalltalk
영향받은
Groovy, Java, Nu, Objective-J, TOM, Swift[2]

Objective-C는 C 프로그래밍 언어에 Smalltalk 스타일의 메시지를 추가하는 범용 객체 지향 프로그래밍 언어입니다.1980년대 초 브래드 콕스와 톰 러브가 개발한 NextSTEP 운영체제로 NextXT에 의해 선택되었습니다.Objective-C는 2014년 [4]Swift가 출시되기 전까지 Apple이 각각애플리케이션 프로그래밍 인터페이스(API), 코코아코코아 Touch를 사용하여 MacOS(NeXTSTEP에서[3] 파생) 및 iOS 애플리케이션을 개발하기 위해 지원하는 표준 프로그래밍 언어였습니다.

비 Apple 운영체제용으로 개발되거나 Apple API에 의존하지 않는 Objective-C 프로그램은 GNU GCC 또는 LLVM/Clang에서 지원되는 모든 플랫폼용으로 컴파일될 수 있습니다.

Objective-C 소스 코드 '메시지/실장' 프로그램 파일에는 보통 다음과 같은 기능이 있습니다..m 파일 이름 확장자.단, Objective-C 'header/interface' 파일의 확장자는 .h로 C 헤더 파일과 동일합니다.Objective-C++ 파일은 .mm 파일 확장자로 표시됩니다.

역사

Objective-C는 주로 Brad Cox와 Tom Love가 1980년대 초에 Productivity Products International(PPI)[5]에서 개발한 것입니다.

회사 설립에 앞서 1981년 ITT Corporation의 Programming Technology Center에서 Smalltalk를 소개받았습니다.Objective-C에 대한 최초의 연구는 그 [6]무렵으로 거슬러 올라간다.Cox는 소프트웨어 설계와 프로그래밍에서 진정한 재사용 가능성에 대한 문제에 흥미를 보였습니다.그는 Smalltalk와 같은 언어가 ITT의 시스템 개발자를 위한 개발 환경을 구축하는 데 매우 유용하다는 것을 깨달았습니다.그러나 그와 Tom Love는 또한 C와의 후방 호환성이 ITT의 통신 [7]엔지니어링 환경에서 매우 중요하다는 것을 인식했습니다.

Cox는 Smalltalk의 일부 기능을 추가하기 위해 C를 위한 프리프로세서를 작성하기 시작했다.그는 곧 오브젝트 지향 프리 컴파일러를 [8]위한 OOPC라고 불리는 C 언어의 오브젝트 지향 확장을 실장했습니다.1982년 Schlumberger Research에 의해 고용되어 Smalltalk-80의 첫 광고 카피를 획득할 기회를 얻었고, 이는 그들의 두뇌 개발에 더욱 영향을 미쳤다.실질적인 진전이 있을 수 있음을 증명하기 위해, Cox는 호환 가능한 소프트웨어 구성 요소를 만드는 데 실제로 필요한 것은 기존 도구에 대한 몇 가지 실질적인 변경뿐이라는 것을 보여주었습니다.구체적으로는 오브젝트를 유연하게 지원하고 사용 가능한 라이브러리 세트를 제공하며 코드(및 코드에 필요한 리소스)를 하나의 크로스 플랫폼 형식으로 번들할 수 있어야 했습니다.

Love와 Cox는 최종적으로 PPI를 형성하여 제품을 상용화하였고, Objective-C 컴파일러와 클래스 라이브러리를 결합하였습니다.1986년, 콕스는 Objective-C의 주요 설명을 원래 형태로 객체 지향 프로그래밍, 진화론적 접근법이라는 책에서 발표했습니다.Objective-C가 제공하는 기능뿐만 아니라 재사용성의 문제에도 주의를 기울여 지적했지만, 이 언어 자체는 종종 다른 언어와 기능을 비교하고 있습니다.

NeXT를 통한 대중화

1988년 NeXT는 StepStone(Objective-C 상표의 소유자, PPI의 새 이름)에서 Objective-C를 라이센스하고 GCC 컴파일러를 확장하여 Objective-C를 지원했습니다.NeXT는 NextSTEP 사용자 인터페이스와 인터페이스 빌더의 기반이 되는 AppKitFoundation Kit 라이브러리를 개발했습니다.NeXT 워크스테이션은 시장에서 큰 영향을 미치지 못했지만, 이 툴은 업계에서 널리 찬사를 받았습니다.이에 따라 NeXT는 하드웨어 생산을 중단하고 소프트웨어 툴에 주력하여 NeXTSTEP(및 OPENSTEP)를 커스텀 프로그래밍 플랫폼으로 판매하게 되었습니다.

GPL의 조건을 회피하기 위해 NeXT는 원래 Objective-C 프런트엔드를 개별적으로 출하하여 사용자가 컴파일러 실행 파일을 생성하기 위해 GCC와 링크할 수 있도록 했습니다.처음에는 리처드 M.의해 받아들여졌지만요. Stallman, Stallman이 GNU의 변호사와 협의하여 NeXT가 Objective-C를 GCC의 일부로 [9]만드는 것에 동의한 후 이 계획은 거부되었습니다.

GCC를 확장하는 작업은 Steve Naroff가 주도했으며 Steve Naroff는 StepStone에서 NeXT에 합류했습니다.컴파일러의 변경은 GPL 라이센스 조건에 따라 제공되었지만 런타임 라이브러리는 제공되지 않아 일반 대중이 오픈 소스의 기여를 사용할 수 없게 되었습니다.이로 인해 다른 당사자들은 오픈 소스 라이센스로 이러한 런타임 라이브러리를 개발하게 되었습니다.나중에 Steve Naroff는 Clang에 Objective-C 프런트엔드를 구축하기 위해 Apple에서 일하는 데에도 기여했습니다.

GNU 프로젝트OpenStep [10]표준에 기반한 GNUStep이라는 이름의 코코아의 무료 소프트웨어 구현 작업을 시작했습니다.Dennis Glating은 1992년에 첫 번째 GNU Objective-C 런타임을 작성했습니다.1993년부터 사용되고 있는 GNU Objective-C 런타임은 [citation needed]Kresten Krab Torup이 덴마크 대학생이었을 때 개발한 런타임입니다.Thorup은 또한 1993년부터 [11]1996년까지 NeXT에서 일했다.

Apple 개발 및 Swift

1996년에 NeXT를 인수한 후, 애플 컴퓨터는 당시 새로운 운영 체제인 Mac OS X에서 OpenStep을 사용했습니다.여기에는 NeXT의 Objective-C 기반 개발자 도구인 Objective-C, Project Builder 및 인터페이스 설계 도구인 Interface Builder가 포함됩니다.둘 다 나중에 하나의 애플리케이션인 Xcode로 통합되었습니다.Apple의 현재 Cocoa API의 대부분은 OpenStep 인터페이스 오브젝트를 기반으로 하고 있으며, 활발한 개발에 사용되고 있는 가장 중요한 Objective-C 환경입니다.

WWDC 2014에서 애플은 "Objective-C without the C"라는 새로운 언어를 발표했습니다.

구문

Objective-C는 C 위에 있는 얇은 레이어이며 C의 "엄격한 슈퍼셋"입니다.즉, Objective-C 컴파일러를 사용하여 C 프로그램을 컴파일하고 [12][13][14][15][16][17]Objective-C 클래스에 C 언어 코드를 자유롭게 포함할 수 있습니다.

Objective-C는 Smalltalk에서 오브젝트 구문을 도출합니다.오브젝트 지향 이외의 조작(프리미티브 변수, 전처리, 식, 함수 선언 및 함수 호출 포함)의 구문은 모두 C의 구문과 동일하지만 오브젝트 지향 기능의 구문은 Smalltalk 스타일의 메시징 구현입니다.

메시지

객체 지향 프로그래밍의 Objective-C 모델은 객체 인스턴스에 전달되는 메시지에 기초합니다.Objective-C에서는 메서드를 호출하지 않고 메시지를 보냅니다.이것은 C++에서 사용하는 Simula 스타일의 프로그래밍 모델과 다릅니다.이러한 두 개념의 차이는 메서드 또는 메시지 이름에 의해 참조되는 코드가 실행되는 방식에 있습니다.Simula 스타일의 언어에서 메서드 이름은 대부분의 경우 컴파일러에 의해 대상 클래스의 코드 섹션에 바인딩됩니다.Smalltalk 및 Objective-C에서는 메시지의 타깃은 런타임에 해결되며 수신 객체 자체가 메시지를 해석합니다.메서드는 셀렉터 또는 SEL에 의해 식별되며(각 메시지 이름의 고유 식별자(종종 NUL 종단 문자열)는 이름을 나타내는 NUL로 끝나는 경우가 많으며) 이를 구현하는 C 메서드 포인터([18]IMP)로 해결됩니다.이 결과 메시지 전달 시스템에는 유형 체크가 없습니다.메시지의 수신처 오브젝트(수신자)는 메시지에 대한 응답을 보증하지 않습니다.메시지가 수신되지 않으면 [19]예외가 발생합니다.

포인터 obj가 가리키는 오브젝트에 메시지메서드를 송신하려면 , C++다음의 코드가 필요합니다.

obj->방법(논쟁); 

Objective-C에는 다음과 같이 기술되어 있다.

[obj 방법:논쟁]; 

"method" 호출은 컴파일러에 의해 objc_msgSend(id self, SEL op, ...) 계열의 런타임 함수로 변환됩니다.다양한 구현이 [20]슈퍼와 같은 최신 추가 기능을 처리합니다.GNU 패밀리에서 이 함수는 objc_msg_sendv라고 불리지만 objc_msg_lookup [21]아래의 최신 룩업시스템에서는 사용되지 않습니다.

두 가지 프로그래밍 스타일 모두 장단점이 있습니다.Simula(C++) 스타일의 객체 지향 프로그래밍은 가능한 한 컴파일 시간 바인딩을 사용하여 다중 상속과 빠른 실행을 가능하게 하지만 기본적으로 동적 바인딩을 지원하지 않습니다.또한 추상적이지 않은 한 모든 메서드가 해당 구현을 수행하도록 강제합니다.Objective-C에서 사용되는 Smalltalk 스타일의 프로그래밍을 사용하면 실행 시 메서드가 해결되어 메시지가 구현되지 않을 수 있습니다.예를 들어, 메시지를 오브젝트 모음으로 보낼 수 있으며, 일부 오브젝트만 응답할 것으로 예상되며 런타임 오류가 발생할 염려가 없습니다.또한 메시지 전달을 위해 컴파일 시 개체를 정의할 필요가 없습니다.파생 객체에서 메서드를 호출하려면 아직 구현이 필요합니다.(다이나믹(최신) 바인딩의 이점에 대해서는, 다음의 다이나믹 타이핑 섹션을 참조해 주세요).

인터페이스 및 구현

Objective-C에서는 클래스의 인터페이스와 구현이 별도로 선언된 코드 블록 내에 있어야 합니다.관례상 개발자는 인터페이스를 헤더 파일에 배치하고 구현을 코드 파일에 배치한다.헤더 파일(일반적으로 .h)은 C 헤더 파일과 비슷하지만 구현(메서드) 파일(일반적으로 .m)은 C 코드 파일과 매우 유사할 수 있습니다.

인터페이스

이는 C++나 Python과 같은 다른 객체 지향 언어에서 사용되는 클래스 선언과 유사합니다.

클래스의 인터페이스는 보통 헤더파일로 정의됩니다.일반적인 규칙은 헤더 파일에 클래스 이름을 붙이는 것입니다.를 들어 Ball.h는 클래스 Ball의 인터페이스를 포함합니다.

인터페이스 선언의 형식은 다음과 같습니다.

@interface classname {// 인스턴스 변수} + classMethod1; + (return_type) classMethod2; + (return_type) classMethod3: (param1_type) param1_varName; - (return_type) instanceMethod1With1 파라미터: (param1_type) param1_varName; - (return_type) instanceMethod2With 2Parameters:(param1_type) param1_varName param2_callName:(param2_type) param2_varName; @end

위에서 플러스 기호는 클래스 메서드 또는 클래스 자체(인스턴스가 아님)에서 호출할 수 있는 메서드를 나타내며 마이너스 기호는 클래스의 특정 인스턴스에서만 호출할 수 있는 인스턴스 메서드를 나타냅니다.클래스 메서드도 인스턴스 변수에 액세스할 수 없습니다.

위의 코드는 다음 C++ 인터페이스와 거의 동일합니다.

학급 클래스명 : 일반의 슈퍼클래스명 { 보호되고 있다:   // 인스턴스 변수  일반의:   // 클래스(정적) 함수   정적인 무효 *class Method 1();   정적인 return_type(반환형) class Method 2();   정적인 return_type(반환형) class Method 3(param1_type param1_varName);    // 인스턴스(멤버) 함수   return_type(반환형) instance Method 1With1 파라미터(param1_type param1_varName);   return_type(반환형)   instance Method 22 파라미터 포함(param1_type param1_varName,                                  param2_type param2_varName = 체납); }; 

instanceMethod2With2Parameters:param2_callName:는 C/C++에 직접 대응하는 것이 없는 인수식을 가진 셀렉터 세그먼트의 인터리빙을 나타내고 있습니다.

반환 유형에는 임의의 표준 C 유형, 범용 Objective-C 객체에 대한 포인터, NSAray *, NSImage *, NSString * 등의 특정 객체 유형에 대한 포인터 또는 메서드가 속한 클래스에 대한 포인터(인스턴스 유형)를 사용할 수 있습니다.기본 반환 유형은 일반 Objective-C 유형 ID입니다.

메서드 인수는 메서드 이름의 일부인 인수에 라벨을 붙이는 이름으로 시작하고 콜론 뒤에 괄호 안의 예상 인수 유형 및 인수 이름으로 시작합니다.라벨은 생략할 수 있습니다.

- (무효)set Range Start:(인트)개시하다 종료:(인트)끝.; - (무효)Import 문서With Name(이름:(동작하지 않다 *)이름.       with Specified Preferences:(우선권 *)프리프                     페이지 전:(인트)페이지 삽입; 

인터페이스 정의의 파생물은 카테고리로 기존 [22]클래스에 메서드를 추가할 수 있습니다.

실행

인터페이스는 클래스 인터페이스만 선언하고 메서드 자체는 선언하지 않습니다.실제 코드는 실장 파일에 기록됩니다.구현(방식) 파일에는 일반적으로 파일 확장자가 있습니다..m(원래는 "[23]displicate"를 의미)

@communications(@정보) 클래스명 + (return_type(반환형))class Method {   // 구현 } - (return_type(반환형))instance Method(인스턴스 메서드) {   // 구현 } @end 

메서드는 인터페이스 선언을 사용하여 기술됩니다.목표 C와 C의 비교:

- (인트)방법:(인트)i {   돌아가다 [자신 제곱근:i]; } 
인트 기능.(인트 i) {   돌아가다 제곱근(i); } 

이 구문을 사용하면 인수의 의사 이름을 지정할 수 있습니다.

- (무효)changeColorToRed:(흘러가다)빨간. 녹색:(흘러가다)초록의 파란색:(흘러가다)파랑색 {   //... 구현... }  // 이렇게 호출: [마이컬러 change Color To Red(컬러 토레드):5.0 초록의:2.0 파랑색:6.0]; 

방법의 내부 표현은 목적 C의 구현마다 다르다.myColor가 Color 클래스인 경우 인스턴스 메서드 -changeColorToRed:green:blue:는 내부적으로 _i_Color_changeColorToRed_green_blue라는 라벨이 붙어 있을 수 있습니다.i는 인스턴스 메서드를 참조하고 클래스 및 메서드 이름을 추가하고 콜론을 밑줄로 변경합니다.매개 변수의 순서는 메서드 이름의 일부이므로 실제 명명된 매개 변수와 같이 코딩 스타일 또는 표현식에 맞게 변경할 수 없습니다.

그러나 함수의 내부 이름은 거의 직접 사용되지 않습니다.일반적으로 메시지는 Objective-C 런타임라이브러리에 정의된 함수콜로 변환됩니다.수신자의 클래스(메시지를 송신하는 오브젝트)를 런타임까지 알 필요가 없기 때문에, 어느 메서드가 호출될지는 링크시에 알 수 없습니다.

인스턴스화

Objective-C 클래스가 작성되면 인스턴스화할 수 있습니다.이 작업은 먼저 초기화되지 않은 클래스 인스턴스(개체)를 할당한 후 초기화함으로써 수행됩니다.오브젝트는 두 단계가 모두 완료될 때까지 완전히 기능하지 않습니다.이러한 순서는 1행의 코드로 실행되어야 합니다.이러한 순서는, 초기화를 실시하지 않은 할당 오브젝트가 존재하지 않게 됩니다(또, 중간 결과를 그 이후에 보관 유지하는 것은 현명하지 않기 때문에).-init는 호출된 오브젝트와는 다른 오브젝트를 반환할 수 있습니다).

기본 파라미터 없음 이니셜라이저를 사용한 인스턴스화:

마이 오브젝트 *후우 = [[마이 오브젝트 할당하다] 초기화]; 

커스텀 이니셜라이저를 사용한 인스턴스화:

마이 오브젝트 *후우 = [[마이 오브젝트 할당하다] init With String:myString]; 

커스텀 초기화가 실행되지 않은 경우 allocate-init 메시지 대신 "new" 메서드를 사용할 수 있습니다.

마이 오브젝트 *후우 = [마이 오브젝트 신규]; 

또한 클래스 메서드 이니셜라이저를 구현하는 클래스도 있습니다.맘에 들다+new, 이 조합은+alloc그리고.-init, 단,+new는 자동 리리스된 인스턴스를 반환합니다.일부 클래스 메서드 이니셜라이저는 다음 파라미터를 사용합니다.

마이 오브젝트 *후우 = [마이 오브젝트 물건]; 마이 오브젝트 *막대기 = [마이 오브젝트 object With String:@"Wikipedia:"]; 

allocate 메시지는 객체의 모든 인스턴스 변수를 저장하기에 충분한 메모리를 할당하고 모든 인스턴스 변수를 0 값으로 설정하여 메모리를 클래스의 인스턴스로 변환합니다.초기화 중에는 메모리가 슈퍼클래스의 인스턴스가 되지 않습니다.

init 메시지는 작성 시 인스턴스 셋업을 수행합니다.init 메서드는 종종 다음과 같이 기술됩니다.

- (아이디)초기화 {     자신 = [잘 하는 군요 초기화];     한다면 (자신) {         // 여기서 오브젝트 초기화 실행     }     돌아가다 자신; } 

위의 예에서는idreturn type 입니다.이 유형은 Objective-C의 "모든 개체에 포인터"를 나타냅니다(동적 입력 섹션 참조).

initializer 패턴은 init 메서드가 초기화를 수행하기 전에 오브젝트가 슈퍼클래스에 의해 올바르게 초기화되도록 하기 위해 사용됩니다.다음 작업을 수행합니다.

  1. self = [슈퍼 초기화]
    슈퍼클래스 인스턴스에 init 메시지를 발송하고 결과를 self에 할당합니다(현재 객체에 포인터).
  2. (본인)의 경우
    초기화를 수행하기 전에 반환된 개체 포인터가 유효한지 확인합니다.
  3. 되돌아오다
    발신자에게 self 값을 반환합니다.

유효하지 않은 오브젝트 포인터의 은 0입니다.즉, "if"와 같은 조건문은 null 포인터처럼 처리되기 때문에 [super init]가 null을 반환해도 초기화 코드는 실행되지 않습니다.초기화에 오류가 있는 경우 init 메서드는 자신에게 "release" 메시지를 보내는 등 필요한 청소를 수행하고 초기화가 실패했음을 나타내는0 을 반환해야 합니다.이러한 오류 체크는 슈퍼클래스의 초기화를 호출한 후에만 수행하여 오브젝트를 올바르게 파기할 수 있도록 해야 합니다.

클래스에 여러 초기화 메서드가 있는 경우 이들 중 1개('지정 이니셜라이저')만 이 패턴을 따라야 합니다.다른 클래스는 슈퍼 클래스 이니셜라이저가 아닌 지정 이니셜라이저를 호출해야 합니다.

프로토콜

다른 프로그래밍 언어에서는 이를 "인터페이스"라고 합니다.

Objective-C는 NeXT에서 프로토콜의 도입을 통해 구현이 아닌 사양의 다중 상속 개념을 도입하도록 확장되었습니다.이는 C++에서 추상적인 다중 상속 기본 클래스 또는 (Java 및 C#에서와 같이) "인터페이스"로 달성할 수 있는 패턴입니다.Objective-C는 비공식 프로토콜이라 불리는 애드혹 프로토콜과 정식 프로토콜이라 불리는 컴파일러 강제 프로토콜을 사용한다.

비공식 프로토콜은 클래스가 구현하도록 선택할 수 있는 메서드의 목록입니다.언어에는 존재하지 않기 때문에 매뉴얼에 기재되어 있습니다.비공식 프로토콜은 NSObject의 범주(아래 참조)로 구현되며 종종 선택적 메서드를 포함하며, 구현되면 클래스의 동작을 변경할 수 있습니다.예를 들어 텍스트 필드 클래스에는 사용자 입력 텍스트의 자동 완료를 수행하기 위한 선택적 방법을 사용하여 비공식 프로토콜을 구현하는 위임자가 있을 수 있습니다.텍스트 필드는 대리인이 (반사를 통해) 해당 메서드를 구현하는지 여부를 검색하고, 구현된 경우 대리인의 메서드를 호출하여 자동 완료 기능을 지원합니다.

정식 프로토콜은 Java, C# 및 Ada 2005의 인터페이스와 유사합니다.모든 클래스가 구현한다고 선언할 수 있는 메서드 목록입니다.2.0 이전 버전의 Objective-C는 클래스가 스스로 채택한다고 선언하는 프로토콜에서 모든 메서드를 구현해야 한다고 요구했습니다. 클래스가 선언된 프로토콜에서 모든 메서드를 구현하지 않으면 컴파일러는 오류를 발생시킵니다.Objective-C 2.0은 프로토콜 내의 특정 메서드 마킹에 대한 지원을 추가했으며 컴파일러는 선택적 메서드의 구현을 강제하지 않습니다.

클래스는 해당 프로토콜을 구현하기 위해 선언되어야 합니다.이것은 런타임에 검출할 수 있습니다.정식 프로토콜은 어떠한 구현도 제공할 수 없으며, 단순히 프로토콜에 부합하는 클래스가 구현을 제공할 것임을 발신자에게 보장합니다.NeXT/Apple 라이브러리에서 프로토콜은 원격 시스템에서 실행되는 개체의 능력을 나타내기 위해 분산 개체 시스템에서 자주 사용됩니다.

구문

@parames(@parames) NSLocking - (무효)잠그다; - (무효)언락; @end 

는 잠금에 대한 추상적인 개념이 있음을 나타냅니다.클래스 정의에 프로토콜이 구현되었음을 명시함으로써

@interface NSLock : NSObject <NSLocking> //...@end

NSLock의 인스턴스는 두 가지 인스턴스 메서드에 대한 구현을 제공한다고 주장합니다.

동적 타이핑

Objective-C는 Smalltalk와 마찬가지로 동적 입력을 사용할 수 있습니다.개체는 인터페이스에서 지정되지 않은 메시지를 보낼 수 있습니다.이렇게 하면 오브젝트가 메시지를 "캡처"하여 메시지에 적절하게 응답할 수 있는 다른 오브젝트에 메시지를 보낼 수 있고, 마찬가지로 다른 오브젝트에 메시지를 보낼 수 있기 때문에 유연성이 향상될 수 있습니다.이 동작을 메시지 전송 또는 위임이라고 합니다(아래 참조).또는 메시지를 전송할 수 없는 경우 오류 핸들러를 사용할 수 있습니다.오브젝트가 메시지를 전송하지 않거나 메시지에 응답하지 않거나 오류를 처리하지 않으면 시스템은 런타임 [24]예외를 생성합니다.메시지가 0(늘 개체 포인터)으로 전송되면 컴파일러 옵션에 따라 메시지가 자동으로 무시되거나 일반 예외가 발생합니다.

정적 입력 정보를 변수에 선택적으로 추가할 수도 있습니다.이 정보는 컴파일 시 체크됩니다.다음 4개의 문장에서 보다 구체적인 유형 정보가 제공됩니다.실행 시 문장은 동일하지만 추가 정보를 통해 전달된 인수가 지정된 유형과 일치하지 않을 경우 프로그래머에게 경고할 수 있습니다.

- (무효)set My Value:(아이디)후우; 

위의 문장에서 foo는 어떤 종류의 것이든 상관없습니다.

- (무효)set My Value:(아이디< >NSCopying>)후우; 

위의 문장에서 foo는 프로토콜을 준수하는 모든 클래스의 인스턴스일 수 있습니다.

- (무효)set My Value:(NS넘버 *)후우; 

위의 문장에서 foo는 NS Number 클래스의 인스턴스여야 합니다.

- (무효)set My Value:(NS넘버< >NSCopying> *)후우; 

위의 문장에서 foo는 NS Number 클래스의 인스턴스여야 하며 프로토콜을 준수해야 합니다.

Objective-C에서는 모든 오브젝트가 포인터로 표시되며 정적 초기화는 허용되지 않습니다.가장 단순한 개체는 id(objc_obj *)가 가리키는 유형으로 클래스를 설명하는 isa 포인터만 있습니다.값 및 구조와 같은 C의 다른 유형은 객체 시스템의 일부가 아니기 때문에 변경되지 않습니다.이 결정은 구조와 클래스가 통합된 C++ 객체 모델과는 다릅니다.

전송

Objective-C는 응답하지 않을 수 있는 객체에 메시지를 보낼 수 있습니다.오브젝트는 메시지에 응답하거나 단순히 메시지를 삭제하는 대신 응답할 수 있는 오브젝트에 메시지를 전송할 수 있습니다.포워딩은 옵서버 패턴이나 프록시 패턴 등 특정 설계 패턴의 구현을 단순화하기 위해 사용할 수 있습니다.

Objective-C 런타임은 오브젝트에 메서드 쌍을 지정합니다.

  • 전송 방식:
    - (취득하다)전송:() args:(arglist_t)args; // GCC 사용 시 - (아이디)전송:() args:(marg_list)args; // NeXT/Apple 시스템 탑재 
  • 액션 방식:
    - (취득하다)퍼포먼스:() args:(arglist_t)args; // GCC 사용 시 - (아이디)퍼포먼스:() args:(marg_list)args; // NeXT/Apple 시스템 탑재 

전송을 실장하는 오브젝트는 전송 동작을 정의하기 위한 새로운 메서드로 전송 메서드를 덮어쓰기만 하면 됩니다.액션 메서드 performv::는 셀렉터와 인수를 기반으로 액션을 수행할 뿐이므로 덮어쓸 필요가 없습니다.주의:SELtype: Objective-C 메시지 유형입니다.

주의: Objective-C에서 일반적으로 사용되는 프레임워크인 OpenStep, Cocoa 및 GNUstep에서는 Object 클래스를 사용하지 않습니다.앞으로 - (void)호출:(NSInvocation *) NSObject 클래스의 호출 메서드는 전송을 수행하기 위해 사용됩니다.

다음은 전달의 기본을 보여주는 프로그램의 예입니다.

Forwarder.h
# Import <objc/Object>h> @interface Forwarder : 객체 {id 수신자; // 메시지를 전송하는 객체. } // Accessor 메서드. - (id) recipient; - (id) set Recipient: (id)_recipient; @end
Forwarder.m
# Import "Forwarder"h"  @communications(@정보) 포워더 - (취득하다)전송:() args:(arglist_t)args {   /* * 수신자가 실제로 메시지에 응답하는지 확인합니다. * 이것은 바람직하거나 바람직하지 않을 수 있습니다.예를 들어, 수신자가 * 이번에는 메시지에 응답하지 않습니다.전송할 수 있습니다. * 그 자체입니다. */   한다면 ([받는사람 respons To Selector(응답 선택기):]) {     돌아가다 [받는사람 퍼포먼스: args:args];   } 또 다른 {     돌아가다 [자신 에러:"수신자가 응답하지 않음"];   } }  - (아이디)set Recipient:(아이디)_개요 {   [받는사람 자동 리리스];   받는사람 = [_개요 유지하다];   돌아가다 자신; }  - (아이디)받는사람 {   돌아가다 받는사람; } @end 
Recipient.h
#import <objc/Object.h> // 단순한 Recipient 객체.@interface Recipient : 오브젝트 - (id)hello; @end
수신자.m
# Import "수신자"h"  @communications(@정보) 받는사람  - (아이디)안녕 {   인쇄물("수신자가 안부 전해달래요!\n");    돌아가다 자신; }  @end 
메인
# Import "Forwarder"h" # Import "수신자"h"  인트 주된(무효) {   포워더 *포워더 = [포워더 신규];   받는사람 *받는사람 = [받는사람 신규];    [포워더 set Recipient(수신자):받는사람]; // 수신자를 설정합니다.   /* * Forwarder가 hello 메시지에 응답하지 않습니다!그것은 그럴거다. * 전송 됩니다.인식되지 않는 모든 메서드가 다음으로 전송됩니다. * 수취인 * (수신자가 Forwarder에 기재된 대로 응답하는 경우) */   [포워더 안녕];    [받는사람 풀어주다];   [포워더 풀어주다];    돌아가다 0; } 

메모들

gcc를 사용하여 컴파일하면 컴파일러는 다음과 같이 보고합니다.

$ gcc - x objective - c - Wno - import Forwarder . main . m : in unction ' main ' : main . m : warning : ' Forwarder '가 hello' $에 응답하지 않음

컴파일러는 Forwarder가 hello 메시지에 응답하지 않는다는 이전 지적을 보고하고 있습니다.이 경우 전송이 구현되었으므로 경고를 무시해도 안전합니다.프로그램을 실행하면 다음과 같은 출력이 생성됩니다.

$./a.out 수신자가 안부 전해달래요! 

분류

Objective-C의 설계 과정에서 주요 관심사 중 하나는 대규모 코드 베이스의 유지관리 가능성이었다.구조화된 프로그래밍 세계의 경험에 따르면 코드를 개선하는 주요 방법 중 하나는 코드를 더 작은 조각으로 분해하는 것이었습니다.Objective-C는 이 [25]프로세스를 지원하기 위해 Smalltalk 구현에서 범주의 개념을 차용하고 확장했습니다.

또한 카테고리 내의 메서드는 런타임에 클래스에 추가됩니다.따라서, 카테고리를 통해 프로그래머는 클래스를 재컴파일하거나 소스 코드에 액세스하지 않고도 기존 클래스(오픈 클래스)에 메서드를 추가할 수 있습니다.예를 들어 시스템에 String 구현에 철자 검사기가 없는 경우 String 소스 코드를 수정하지 않고 추가할 수 있습니다.

카테고리 내의 메서드는 프로그램을 실행하면 클래스 내의 메서드와 구별할 수 없게 됩니다.카테고리는 개인 변수를 포함하여 클래스 내의 모든 인스턴스 변수에 대한 전체 액세스 권한을 가집니다.

카테고리가 클래스의 기존 메서드와 동일한 메서드 서명을 사용하여 메서드를 선언하는 경우 해당 카테고리의 메서드가 채택됩니다.따라서 카테고리는 클래스에 메서드를 추가할 수 있을 뿐만 아니라 기존 메서드를 대체할 수도 있습니다.이 기능은 다른 클래스의 버그를 수정하기 위해 메서드를 다시 쓰거나 프로그램 내에서 클래스의 동작을 전체적으로 변경하는 데 사용할 수 있습니다.두 범주의 메서드가 이름이 같지만 메서드 시그니처가 다른 경우 어떤 카테고리의 메서드가 채택될지는 정의되지 않습니다.

다른 언어에서는 다양한 방법으로 이 기능을 추가하려고 시도하고 있습니다.TOM은 Objective-C 시스템을 한 걸음 더 나아가 변수 추가도 허용했습니다.다른 언어에서는 프로토타입 기반 솔루션을 대신 사용하고 있으며, 가장 주목할 만한 것은 셀프입니다.

C# 및 Visual Basic.NET 언어는 확장 메서드의 형태로 표면적으로 유사한 기능을 구현하지만 이러한 [26]언어들은 클래스의 개인 변수에 액세스할 수 없습니다.Ruby와 다른 여러 동적 프로그래밍 언어들은 이 기술을 "원숭이 패치"라고 부릅니다.

Logtalk는 Objective-C 범주 기능을 포함하는 범주 개념을 구현합니다(Logtalk 범주는 새로운 클래스 또는 프로토타입 등을 정의할 때 세분화된 구성 단위로 사용할 수도 있습니다. 특히 Logtalk 범주는 다양한 클래스 및 프로토타입에서 가상으로 가져올 수 있습니다).

범주의 사용 예

예에서는 먼저 악세사리 메서드만 구현된 기본 클래스를 정의하고 기본 클래스를 확장하는 산술과 표시의 두 가지 카테고리를 추가하여 Integer 클래스를 구축합니다.카테고리는 기본 클래스의 개인 데이터 멤버에 액세스할 수 있지만, 대부분의 경우 이러한 개인 데이터 멤버에 액세스하려면 보조기 메서드를 사용하여 액세스하는 것이 좋습니다. 따라서 카테고리는 기본 클래스에서 더 독립적입니다.이러한 악세사리를 실장하는 것은 카테고리의 일반적인 사용법 중 하나입니다.다른 하나는 카테고리를 사용하여 기본 클래스에 메서드를 추가하는 것입니다., 서브클래스의 오버라이드(monkey patching이라고도 함)에 카테고리를 사용하는 것은 권장되지 않습니다.비공식 프로토콜은 기본 NSObject 클래스의 범주로 구현됩니다.규칙에 따라 기본 클래스를 확장하는 카테고리를 포함하는 파일에는 BaseClass+ExtensionClass.h라는 이름이 붙습니다.

Integer.h
# Import <objc/Object>h> @interface Integer : 오브젝트 {int 정수;} - (int) 정수; - (id) 정수: (int)_integer; @end
정수.m
# Import "정수"h"  @communications(@정보) 정수 - (인트) 정수 {   돌아가다 정수; }  - (아이디) 정수: (인트) _개요 {   정수 = _개요;   돌아가다 자신; } @end 
정수+산술.h
# Import "정수"h"  @interface 정수 (산술) - (아이디) 추가: (정수 *) 부가물; - (아이디) 서브: (정수 *) 하위 강조 표시; @end 
정수+산술.m
# Import "정수+산술"h"  @communications(@정보) 정수 (산술) - (아이디) 추가: (정수 *) 부가물 {   돌아가다 [자신 정수: [자신 정수] + [부가물 정수]]; }  - (아이디) 서브: (정수 *) 하위 강조 표시 {   돌아가다 [자신 정수: [자신 정수] - [하위 강조 표시 정수]]; } @end 
Integer+Display.h
# Import "정수"h"  @interface 정수 (표시) - (아이디) 쇼스타; - (아이디) 표시하다; @end 
Integer+Display.m
# "Integer+Display" 를 Import 합니다.h"  @communications(@정보) 정수 (표시) - (아이디) 쇼스타 {   인트 i, x = [자신 정수];   위해서 (i = 0; i < > x; i++) {     인쇄물("*");   }   인쇄물("\n");    돌아가다 자신; }  - (아이디) 표시하다 {   인쇄물(%d\n", [자신 정수]);    돌아가다 자신; } @end 
메인
# Import "정수"h" # Import "정수+산술"h" # Import "Integer+Display.h"  인트 주된(무효) {   정수 *숫자 1 = [정수 신규], *숫자 2 = [정수 신규];   인트 x;    인쇄물("정수 입력: ");   스캔(%d, &x);    [숫자 1 정수:x];   [숫자 1 쇼스타];    인쇄물("정수 입력: ");   스캔(%d, &x);    [숫자 2 정수:x];   [숫자 2 쇼스타];    [숫자 1 더하다:숫자 2];   [숫자 1 표시하다];    돌아가다 0; } 

메모들

컴파일은 다음과 같이 수행됩니다.

gcc -x objective-c main.mInteger.m Integer+산술.mInteger+Display.m - lobjc

#import "Integer+산술"을 생략하면 실험할 수 있습니다.h"[num1 add:num2] 행과 컴파일에서 Integer+Marithmetic.m을 생략합니다.프로그램은 계속 실행됩니다.즉, 필요에 따라 추가된 카테고리를 조합할 수 있습니다.카테고리에 어떤 기능이 없어도 컴파일 할 수 있습니다.

포즈

Objective-C는 프로그램 내에서 클래스가 다른 클래스를 완전히 대체할 수 있도록 합니다.치환 클래스는 타겟클래스로 간주됩니다.

클래스 포즈는 Mac OS X v10.5에서 사용되지 않는 것으로 선언되었으며 64비트 런타임에서는 사용할 수 없습니다.유사한 기능은 한 메서드의 구현을 동일한 시그니처를 가진 다른 메서드의 구현과 교환하는 카테고리에서의 메서드 스위징을 사용하여 달성할 수 있습니다.

포징을 지원하는 버전의 경우 타깃클래스로 전송되는 모든 메시지가 포징클래스에 의해 수신됩니다.몇 가지 제약사항이 있습니다.

  • 클래스는 직접 또는 간접 슈퍼클래스 중 하나로만 위장할 수 있습니다.
  • 포즈 클래스는 타깃클래스에 없는 새로운 인스턴스 변수를 정의해서는 안 됩니다(단 메서드를 정의하거나 덮어쓸 수 있습니다.
  • 대상 클래스가 포즈 전에 메시지를 수신하지 않았을 수 있습니다.

카테고리와 마찬가지로 포즈도 기존 클래스의 글로벌 증강을 가능하게 합니다.포즈 설정에서는 카테고리에서 다음 두 가지 기능이 제외됩니다.

  • 포즈 클래스는 슈퍼를 통해 오버라이드된 메서드를 호출할 수 있으므로 타깃클래스의 실장이 포함됩니다.
  • 포즈 클래스는 카테고리에 정의된 메서드를 재정의할 수 있습니다.

예를들면,

@interface 커스텀NSApplication : NSApplication @end @implementation 커스텀NSApplication - (void) setMainMenu: (NSMenu*) 메뉴 {// 메뉴 } @end class_poseAs ([커스텀])NSApplication 클래스], [NSApplication 클래스]);

이것은 NSApplication에 대한 setMainMenu의 모든 호출을 대행 수신합니다.

# Import

C 언어에서는#includepre-private 디렉티브를 지정하면 항상 파일의 내용이 해당 시점에서 소스에 삽입됩니다.Objective-C는#import각 파일이 컴파일 유닛당 1회만 포함되므로 가드를 포함할 필요가 없습니다.

Linux gcc 컴파일

// 파일: hello.m # Import <기초/기초>h> 인트 주된 (인트 argc, 컨스턴트  * argv[]) {     /* 목표 C에서의 첫 프로그램 */     NSlog(@"안녕, 세상아!\n");     돌아가다 0; } 
# gccMinGW 컴파일러 명령줄 컴파일: $ gcc \ $ ( gnustep - config -- objc - flags ) \ o hello \ hello . m \ - L / GNUstep / System / Library / Libraries \ - lobjc \ - lgnustep - base . . . . . . . . . . . . 。

기타 기능

Objective-C의 기능을 통해 프로그래밍 문제를 유연하고 쉽게 해결할 수 있습니다.

  • 다른 오브젝트에 메서드를 위임하고 리모트 호출을 실시하려면 카테고리와 메시지 전송을 사용합니다.
  • 의 스위즐링isa포인터를 사용하면 실행 시 클래스를 변경할 수 있습니다.일반적으로 해방된 오브젝트가 호출 시 오류를 보고하는 것이 유일한 목적인 좀비 오브젝트로 스위칭되는 디버깅에 사용됩니다.데이터베이스 장애를 [citation needed]생성하기 위해 Enterprise Objects Framework에서도 스위즐링이 사용되었습니다.스위즐링은 오늘날 Apple Foundation Framework에서 주요 가치 관찰을 구현하기 위해 사용됩니다.

언어의 변종

목표 - C++

Objective-C++는 GNU 컴파일러 컬렉션Clang의 프론트 엔드에 의해 받아들여지는 언어 변종이며, C++와 Objective-C 구문을 조합하여 소스 파일을 컴파일할 수 있습니다.Objective-C++는 Objective-C가 C에 추가하는 확장을 C++에 추가합니다.다양한 언어 기능의 배후에 있는 시멘틱스를 통일하는 것은 아무것도 행해지지 않기 때문에, 다음의 몇개의 제약사항이 적용됩니다.

  • C++ 클래스는 Objective-C 클래스에서 파생될 수 없으며 그 반대도 마찬가지입니다.
  • C++ 네임스페이스는 Objective-C 선언 내에서 선언할 수 없습니다.
  • 목표 C 선언은 C++ 네임스페이스 내부가 아닌 글로벌 범위에만 표시될 수 있습니다.
  • Objective-C 클래스에는 기본 컨스트럭터가 없거나 하나 이상의 가상 [citation needed]메서드가 있는 C++ 클래스의 인스턴스 변수를 사용할 수 없습니다.단, C++ 오브젝트에 대한 포인터는 제한 없이 인스턴스 변수로 사용할 수 있습니다(-init 메서드에서 신규로 할당).
  • C++ "값별" 의미론은 포인터를 통해서만 액세스할 수 있는 Objective-C 개체에 적용할 수 없습니다.
  • Objective-C 선언은 C++ 템플릿 선언 내에 포함할 수 없으며 그 반대도 마찬가지입니다.단, Objective-C 타입(예:Classname *)는 C++ 템플릿파라미터로 사용할 수 있습니다.
  • Objective-C 및 C++ 예외 처리는 구별됩니다.각각의 핸들러는 다른 유형의 예외를 처리할 수 없습니다.그 결과 객체 소멸자는 실행되지 않습니다.오브젝티브-C 예외가 C++ 예외로 완전히 대체되거나(Apple 런타임), 오브젝티브-C++ 라이브러리가 링크되었을 때(GNUstep libobjc2)[27] 이것은 최근의 "Objective-C 2.0" 런타임에서 완화되었습니다.
  • Objective-C 블록과 C++11 람다는 별개의 엔티티입니다.단,[28] 블록이 예상되는 람다를 전달하면 macOS에서 블록이 투과적으로 생성됩니다.

목표-C 2.0

2006년 세계 개발자 회의에서 애플은 "현대 가비지 컬렉션, 구문 향상,[29] 런타임 성능 [30]향상 및 64비트 지원"을 포함하는 Objective-C 언어의 개정판인 "Objective-C 2.0"의 출시를 발표했다.2007년 10월에 출시된 Mac OS X v10.5에는 Objective-C 2.0 컴파일러가 포함되어 있습니다.GCC 4.6은 선언 및 합성 속성, 닷 구문, 고속 열거, 선택적 프로토콜 메서드, 메서드/프로토콜/클래스 속성, 클래스 확장 및 새로운 GNU Objective-C 런타임 [31]API와 같은 많은 새로운 Objective-C 기능을 지원합니다.

마지막 NeXT용 Objective-C 버전이 "objc4"[32]였기 때문에 Objective-C 2.0이라는 이름은 언어의 버전 관리 시스템이 붕괴되었음을 나타냅니다.이 프로젝트 이름은 Mac OS X Leopard(10.5)[33]의 레거시 Objective-C 런타임 소스 코드의 마지막 릴리스에서 유지되었습니다.

가비지 컬렉션

Objective-C 2.0은 옵션의 보수적인 세대별 가비지 컬렉터를 제공했습니다.하위 호환 모드에서 실행 중인 경우 런타임은 "유지" 및 "해제"와 같은 참조 카운트 작업을 no-ops전환했습니다.가비지 수집을 사용하도록 설정하면 모든 개체가 가비지 수집의 대상이 되었습니다.일반 C 포인터는 기본 쓰기 장벽 컴파일러 가로채기를 트리거하여 가비지 수집에 [34]참여하도록 "_strong"으로 수식할 수 있습니다.오브젝트(또는 GC 메모리)를 수집할 때 "_weak"로 표시된 포인터가 0으로 설정되도록 제로잉 취약 하위 시스템도 제공되었습니다.가비지 컬렉터는 Objective-C 2.[35]0의 iOS 구현에는 존재하지 않습니다.Objective-C의 가비지 컬렉션은 우선순위가 낮은 백그라운드 스레드에서 실행되며 사용자 경험의 [36]응답을 유지하기 위해 사용자 이벤트에서 중지될 수 있습니다.

가비지 컬렉션은 ARC([37]Automatic Reference Counting)를 위해 Mac OS X v10.8에서 더 이상 사용되지 않습니다.ARM64에서 실행되는 iOS 7의 Objective-C는 64비트 워드 중 19비트를 사용하여 태그가 지정된 포인터의 형태[38][39]참조 카운트를 저장합니다.

특성.

Objective-C 2.0에서는 새로운 구문이 도입되어 인스턴스 변수를 속성으로 선언하고 옵션 속성을 사용하여 접근 방식 생성을 설정합니다.속성은 어떤 의미에서 퍼블릭인스턴스 변수입니다.즉, 인스턴스 변수를 속성으로 선언하면 외부 클래스에 해당 속성에 대한 액세스(예: 읽기 전용)를 제공할 수 있습니다.속성은 "읽기 전용"으로 선언될 수 있으며 다음과 같은 스토리지 의미와 함께 제공될 수 있습니다.assign,copy또는retain디폴트로는 속성은atomic이로 인해 잠금이 발생하여 여러 스레드가 동시에 액세스하지 못하게 됩니다.속성은 다음과 같이 선언할 수 있습니다.nonatomic이 잠금이 삭제됩니다.

@interface Person : NSObject {@public NSString *name; @private int age;} @property(복사) NSString *name; @property(읽기 전용) int age; - (id)initWith Age:(int) age; @end

속성은 를 통해 구현됩니다.@synthesize키워드: 속성 선언에 따라 getter(및 읽기 전용이 아닌 경우 setter) 메서드를 생성합니다.또는 getter 및 setter 메서드를 명시적으로 구현해야 합니다.@dynamic키워드를 사용하면 액세스 방식이 다른 수단으로 제공됨을 나타낼 수 있습니다.clang 3.1 이상을 사용하여 컴파일할 경우 명시적으로 선언되지 않은 모든 속성@dynamic,표시했다.readonly또는 완전한 사용자 지정 getter와 setter가 자동으로 암묵적으로 사용됩니다.@synthesized.

@communications(@정보) 사람인 @capsize 이름.;  - (아이디)init With Age:(인트)초기화 {   자신 = [잘 하는 군요 초기화];   한다면 (자신) {     // 참고: 속성 설정자가 아닌 직접 인스턴스 변수 할당     나이 = 초기화;   }   돌아가다 자신; }  - (인트)나이 {   돌아가다 나이; } @end 

속성은 기존 메시지 전달 구문, 도트 표기법 또는 "valueForKey:"/"setValue:forKey:" 메서드를 통해 이름으로 액세스할 수 있습니다.

사람인 *a인물 = [[사람인 할당하다] init With Age:53]; a인물.이름. = @"스티브"; // 참고: 도트 표기, 합성 세터 사용,                          // [aPerson setName: @"Steve"]에 상당합니다. NSlog(@"메시지(%@), 도트 표기(%@), 속성 이름(%@) 및 "에 의한 액세스"        "직접 인스턴스 변수 액세스(% @)",               [a인물 이름.],       a인물.이름., [a인물 밸류 포키:@"이름"], a인물 -> 이름.); 

인스턴스 메서드 내에서 속성액세서를 호출하기 위해 도트 표기법을 사용하려면 "self" 키워드를 사용해야 합니다.

- (무효)Myself With Properties 소개:(부루)useGetter {   NSlog(@"안녕하세요, 저는 %@라고 합니다.", (useGetter ? 자신.이름. : 이름.));   // 메모: getter vs. ivar 액세스 } 

클래스 또는 프로토콜의 속성은 동적으로 검사될 수 있습니다.

인트 i; 인트 속성수 = 0; objc_disc_t *속성 리스트 =     class_copyPropertyList([a인물 학급], &속성수);  위해서 (i = 0; i < > 속성수; i++) {   objc_disc_t *this프로퍼티 = 속성 리스트 + i;   컨스턴트  *속성명 = property_getName(*this프로퍼티);   NSlog(@"사람에게 속성이 있습니다: '%s', 속성명); } 

비취약 인스턴스 변수

Objective-C 2.0은 런타임에서 지원되는 경우(즉, 64비트 MacOS 및 모든 iOS용 코드를 빌드할 때) 취약하지 않은 인스턴스 변수를 제공합니다.최신 런타임에서는 인스턴스 변수 액세스에 간접 레이어가 추가되어 다이내믹 링커가 런타임에 인스턴스 레이아웃을 조정할 수 있습니다.이 기능을 통해 Objective-C 코드에 다음 두 가지 중요한 개선이 가능합니다.

  • 취약한 바이너리 인터페이스 문제를 해결합니다.슈퍼클래스는 바이너리 호환성에 영향을 주지 않고 크기를 변경할 수 있습니다.
  • 속성을 지원하는 인스턴스 변수를 클래스의 인터페이스에서 선언하지 않고 런타임에 합성할 수 있습니다.

고속 열거

NSEnumerator 개체 또는 인덱스를 사용하여 컬렉션을 반복하는 대신 Objective-C 2.0은 빠른 열거 구문을 제공합니다.Objective-C 2.0에서는 다음 루프가 기능적으로는 동등하지만 퍼포먼스 특성이 다릅니다.

// NSEnumerator 사용 NSE numerator *열거자 = [피플 object Enumerator]; 사람인 *p;  하는 동안에 ((p = [열거자 next Object(다음 오브젝트)]) != 제로) {   NSlog(@"%"는 %i세입니다., [p 이름.], [p 나이]); } 
// 인덱스 사용 위해서 (인트 i = 0; i < > [피플 세어보세요]; i++) {   사람인 *p = [피플 objectAt색인:i];   NSlog(@"%"는 %i세입니다., [p 이름.], [p 나이]); } 
// 고속 열거 사용 위해서 (사람인 *p  피플) {   NSlog(@"%"는 %i세입니다., [p 이름.], [p 나이]); } 

NSFastEnumeration [40]프로토콜을 사용하는 포인터 산술로 개체를 열거하는 메서드 호출이 대체되므로 고속 열거는 표준 열거보다 더 효율적인 코드를 생성합니다.

클래스 내선번호

클래스 확장자는 카테고리 이름이 없는 카테고리 선언과 동일한 구문을 가지며, 여기서 선언된 메서드 및 속성이 메인 클래스에 직접 추가됩니다.퍼블릭 헤더에 메서드를 애드버타이즈하지 않고 클래스에 메서드를 추가하는 대신 주로 사용됩니다.클래스 확장에 대해서는 컴파일러가 비공개로 선언된 메서드가 모두 실제로 [41]구현되었는지 확인하는 장점이 있습니다.

코코아 개발에 미치는 영향

MacOS용으로 개발된 Objective-C 어플리케이션 중 위의 Objective-C 2.0을 사용하는 것은 모두 10.5 이전 운영체제(Leopard)와 호환되지 않습니다.고속 열거는 표준 열거와 정확히 동일한 바이너리를 생성하지 않으므로 이 바이너리를 사용하면 Mac OS X 버전 10.4 이전 버전에서 응용 프로그램이 충돌합니다.

블록

블록은 특수 구문을 사용하여 폐쇄를 작성하는 목적-C( C 및 C++)의 비표준 확장입니다.블록은 Mac OS X 10.6 "Snow Leopard" 이상, iOS 4 이상, Libobjc2 1.7 및 clang 3.1 이상 [42]컴파일된 GNUstep에서만 지원됩니다.

#실패하다 <stdio.h> #실패하다 <Block.h> 유형화된 인트 (^인트 블록)();  인트 블록 제조 카운터(인트 개시하다, 인트 증량) {   __블록 인트 i = 개시하다;    돌아가다 block_copy( ^ {     인트 리트 = i;     i += 증량;     돌아가다 리트;   });  }  인트 주된(무효) {   인트 블록 마이카운터 = 제조 카운터(5, 2);   인쇄물("첫 번째 콜: %d\n", 마이카운터());   인쇄물("두 번째 호출: %d\n", 마이카운터());   인쇄물("세 번째 호출: %d\n", 마이카운터());    /*복사되었으므로 릴리즈해야 합니다*/   차단_해제(마이카운터);    돌아가다 0; } /* 출력: 첫 번째 콜: 5 두 번째 콜: 7 세 번째 콜: 9 */ 

모던 오브젝티브-C

Apple은 시간이 지남에 따라 Objective 2.0에 몇 가지 기능을 추가했습니다.이 추가 사항은 "Apple LLVM 컴파일러"에만 적용됩니다.즉, 언어의 프런트 엔드인 "clang"에 적용됩니다.Apple이 사용하는 버전 관리는 업스트림의 LLVM과 다릅니다.오픈 소스 LLVM 버전 [43]번호로의 변환에 대해서는, 「Xcode」툴 체인버전을 참조해 주세요.

자동 참조 카운트

Automatic Reference Counting(ARC; 자동 참조 카운트)은 컴파일 시간 기능으로 프로그래머가 다음을 사용하여 보유 카운트를 수동으로 관리할 필요가 없습니다.retain그리고.release실행 시 발생하는 가비지 컬렉션과 달리 ARC는 유지 수를 관리하는 개별 프로세스의 오버헤드를 제거합니다.[44]ARC와 수동 메모리 관리는 서로 배타적이지 않습니다.프로그래머는 개별 코드 파일에 대해 ARC를 비활성화함으로써 ARC 지원 프로젝트에서 비 ARC 코드를 계속 사용할 수 있습니다.Xcode는 프로젝트를 ARC로 자동 업그레이드하려고 할 수도 있습니다.

ARC는 LLVM 3.0에서 도입되었습니다.이는 Xcode 4.2(2011) 또는 Apple LLVM 컴파일러 3.0으로 [45]변환됩니다.

리터럴

NeXT 및 Apple Obj-C 런타임에는 리터럴 구문을 사용하여 새로운 문자열을 작성하는 짧은 형식이 포함되어 있습니다.@"a new string"또는 CoreFoundation 상수로 드롭합니다.kCFBooleanTrue그리고.kCFBooleanFalse위해서NSNumberBoolean 값을 사용합니다.이 형식을 사용하면 프로그래머가 더 오래 사용할 필요가 없어집니다.initWithString또는 특정 작업을 수행할 때 유사한 방법을 사용합니다.

Apple LLVM 컴파일러 4.0(Xcode 4.4) 이후를 사용하는 경우 어레이, 사전 및 숫자(NSArray,NSDictionary,NSNumber또한 메서드 대신 [46]리터럴 구문을 사용하여 생성할 수도 있습니다.(Apple LLVM 컴파일러 4.0은 오픈소스 LLVM 및 Clang 3.1로 변환됩니다.)[47]

리터럴이 없는 예:

NSAray *myArray = [NSAray array With Objects(개체 포함):오브젝트1,오브젝트2,오브젝트3,제로]; NSDirectionary *myDictionary 1 = [NSDirectionary 사전With Object(개체 포함):some Object(개체) :@"키"]; NSDirectionary *myDictionary 2 = [NSDirectionary 사전With Objects(개체 포함)AndKeys(앤드키):오브젝트1, 키 1, 오브젝트2, 키2, 제로]; NS넘버 *마이넘버 = [NS넘버 번호부여내부:마이인트]; NS넘버 *mySum 번호= [NS넘버 번호부여내부:(2 + 3)]; NS넘버 *myBool 번호 = [NS넘버 번호 With Bool:네.]; 

리터럴의 예:

NSAray *myArray = @[ 오브젝트1, 오브젝트2, 오브젝트3 ]; NSDirectionary *myDictionary 1 = @{ @"키" : some Object(개체) }; NSDirectionary *myDictionary 2 = @{ 키 1: 오브젝트1, 키2: 오브젝트2 }; NS넘버 *마이넘버 = @(마이인트); NS넘버 *mySum 번호 = @(2+3); NS넘버 *myBool 번호 = @네; NS넘버 *myInteger 번호 = @8; 

그러나 실행 파일의 상수로 컴파일되는 문자열 리터럴과는 달리 이러한 리터럴은 위의 메서드 호출과 동등한 코드로 컴파일됩니다.특히 수동으로 참조 카운트된 메모리 관리에서는 이러한 오브젝트가 자동 리리스되므로 기능-정적 변수 또는 기타 종류의 글로벌과 함께 사용할 때 주의가 필요합니다.

서브스크립션

Apple LLVM 컴파일러 4.0 이후를 사용하는 경우 어레이 및 사전(NSArray그리고.NSDictionaryclass)[46]는 서브스크립팅을 사용하여 조작할 수 있습니다.첨자는 인덱스(배열) 또는 키(사전)에서 값을 가져오는 데 사용할 수 있으며, 가변 개체와 함께 개체를 인덱스 또는 키로 설정하는 데 사용할 수도 있습니다.코드에서 첨자는 괄호로 나타냅니다.[ ]를 클릭합니다.[48]

첨자를 사용하지 않는 예:

아이디 오브젝트1 = [일부 어레이 objectAt색인:0]; 아이디 오브젝트2 = [어떤 사전 objectForKey(오브젝트포키):@"키"]; [일부 변경 가능한 어레이 replace Object At색인:0 오브젝트 포함:오브젝트3]; [일부 뮤터블 딕셔너리 set Object(set Object):오브젝트4 :@"키"]; 

첨자를 사용한 예:

아이디 오브젝트1 = 일부 어레이[0]; 아이디 오브젝트2 = 어떤 사전[@"키"]; 일부 변경 가능한 어레이[0] = 오브젝트3; 일부 뮤터블 딕셔너리[@"키"] = 오브젝트4; 

"Modern" Objective-C 구문(1997년)

애플이 NeXT를 구입한 후, Smalltalk보다 자바에 더 익숙한 언어를 프로그래머들이 더 쉽게 받아들이게 하려는 시도가 있었다.이러한 시도 중 하나는 당시[49] Objective-C에 대해 "Modern Syntax"라고 불렸던 것을 도입하는 것이었다(현재의 "고전적" 구문과는 반대).행동에는 변화가 없었고, 이것은 단지 대체 구문일 뿐이었다.다음과 같은 메서드 호출을 쓰는 대신

    물건 = [[마이클래스 할당하다] 초기화];     [물건 first Label: 파라미터1 second Label: 파라미터2]; 

대신 다음과 같이 쓰여 있었다.

    물건 = (마이클래스.할당하다).초기화;     물건.라벨 ( 파라미터1, 파라미터2 ); 

마찬가지로, 선언은 형식에서 비롯되었다.

    -(무효) first Label: (인트)파라미터1 second Label: (인트)파라미터2; 

로.

    -(무효) 라벨 ( 인트 파라미터1, 인트 파라미터2 ); 

이 "현대" 구문은 Objective-C 언어의 현재 방언에서 더 이상 지원되지 않습니다.

멀티 옵지크

mulle-objc 프로젝트는 Objective-C의 또 다른 구현이다.백엔드로 GCC 또는 Clang/LLVM 컴파일러를 지원합니다.이것은 구문, 의미론 및 ABI 호환성 측면에서 다른 런타임과 다릅니다.Linux, FreeBSD 및 윈도우즈를 지원합니다.

휴대용 객체 컴파일러

GCC/NeXT/Apple 실장 외에도 Stepstone 실장에 몇 가지 확장기능이 추가되어 Portable Object Compiler라고 불리는 또 다른 무료 오픈 소스 Objective-C 실장도 존재합니다.[50]Portable Object Compiler에 의해 구현된 확장자 세트는 GCC/NeXT/App의 구현과는 다릅니다.특히 오브젝티브-C를 위한 Smalltalk와 같은 블록을 포함하지만 OpenStep과 그 파생 모델 및 친척에서 광범위하게 사용되는 두 가지 기능인 프로토콜과 카테고리가 없습니다.전반적으로, POC는 언어의 진화에서 오래된 Next 이전 단계를 나타내며, 브래드 콕스의 1991년 저서와 거의 일치합니다.

또한 콕스의 원래 ICPak101 라이브러리(Smalltalk-80 클래스 라이브러리에서 파생됨)를 기반으로 하는 ObjectPak이라는 런타임 라이브러리를 포함하고 있으며 OpenStep FoundationKit와는 상당히 다릅니다.

GEOS 목표-C

PC GEOS 시스템은 GEOS Objective-C 또는 [51]goc로 알려진 프로그래밍 언어를 사용했습니다.이 두 언어는 비슷한 이름임에도 불구하고 전체적인 개념과 @ 기호가 붙은 키워드 사용에서만 유사합니다.

쨍그랑

LLVM 프로젝트의 일부인 Clang 컴파일러 스위트는 Objective-C 및 기타 언어를 구현합니다.GCC 4.3(2008)이 GPLv3로 전환된 후 애플은 이를 폐기하고 수정해야 할 법적 권한이 더 많은 컴파일러인 clang을 선택했습니다.그 결과, 현대의 Objective-C 언어 기능의 대부분은 Clang에서만 지원됩니다.

Clang 기반의 "LLVM 컴파일러"에 대한 Apple의 버전 관리 체계는 LLVM의 오픈 소스 버전 관리와는 다릅니다.번역에[43] 대해서는, 「Xcode」툴 체인 버전을 참조해 주세요.

GNU, GNUstep 및 WinObjC

GNU 프로젝트는 오랫동안 NeXT 및 Obj-C 프로그램을 포팅하는 플랫폼에 관심을 보여 왔습니다.GCC의 libobjc 디렉토리의 ChangeLog는 1998년 이전에 존재했음을 나타냅니다(GCC 2.95). 또한 README은 1993년(GCC 2.4)[52]의 개서를 나타내고 있습니다.

NeXT 프런트 엔드 소스 코드는 GCC의 일부로 만들어졌기 때문에 출시되었으며 파생 버전을 만드는 사람들에게 강제로 그렇게 [when?]하도록 하는 GNU Public License를 출시했습니다.애플은 GCC의 포크를 4.2.1까지 출시하면서 이 전통을 이어갔고, 그 후 컴파일러를 포기했다.GCC의 메인터넌스는 변경을 받아들였지만 Objective-C 2.0 [32]: Which compiler 언어 등의 새로운 기능을 지원하는 데는 그다지 투자하지 않았습니다.

새로운 언어에 관심이 있는 GNUstep 개발자들은 2009년 GCC로부터 독립된 프로젝트인 libobjc2로 GCC libobjc를 이전했다.또한 새로운 언어 [32]: Which compiler 구문을 활용하기 위해 Clang에서 런타임 사용을 준비했습니다.동시에 GCC는 천천히 움직였지만, GCC 4.6.0(2011)에서는 libobjc에서도 Objective-C 2.0으로 이행했습니다.[31][53]GNUstep 문서에 따르면 GCC 구현은 블록, 비취약 변수 및 새로운 [32]: Which runtime ARC에 대한 지원이 아직 부족합니다.

마이크로소프트는 2015년 유니버설 윈도 플랫폼용 iOS 브리지인 WinObjC의 일부로 libobjc2를 분리했다.이 프로젝트는 자체 구현된 코코아 터치와 기본 API와 결합되어 UWP [54]앱 내에서 iOS 애플리케이션 코드를 재사용할 수 있도록 한다.

Windows 에서는, Objective-C Development 툴이 GNUStep 의 Web 사이트에서 다운로드할 수 있습니다.GNUStep Development System은 GNUstep MSYS System, GNUstep Core, GNUstep Devel, GNUstep Cairo, ProjectCenter IDE(Xcode와 비슷하지만 그렇게 복잡하지는 않음), Gorm(Xcode NIB 빌더와 같은 인터페이스 빌더) 패키지로 구성되어 있습니다.이 바이너리 인스톨러는 2016년 [55]이후 업데이트되지 않았기 때문에 대신 Cygwin 또는 MSYS2로 빌드하여 설치하는 것이 더 나을 수 있습니다.

라이브러리 사용

오늘날 Objective-C는 코코아, GNUstep 또는 ObjFW같은 표준 객체의 고정 라이브러리(종종 "킷" 또는 "프레임워크"로 알려져 있음)와 함께 사용됩니다.이러한 라이브러리는 운영체제와 함께 제공되는 경우가 많습니다. GNUstep 라이브러리는 Linux 기반 배포판과 함께 제공되며 코코아는 macOS와 함께 제공됩니다.프로그래머는 기존 기본 클래스(NSObject/OFObject)에서 기능을 강제로 상속하지 않습니다.Objective-C에서는 기존 기능을 상속하지 않는 새로운 루트클래스를 선언할 수 있습니다.원래 Objective-C 기반 프로그래밍 환경에서는 일반적으로 오브젝트 클래스가 기본 클래스로 제공되어 다른 클래스가 거의 모두 상속되었습니다.OpenStep의 도입으로 NeXT는 NSObject라는 새로운 기본 클래스를 만들었습니다.NSObject는 객체보다 추가 기능을 제공합니다(예를 들어 원시 포인터 대신 객체 참조 및 참조 카운트를 사용하는 데 중점을 둡니다).코코아의 거의 모든 클래스는 NSObject에서 상속됩니다.

이름 변경은 OpenStep API 내에서 클래스의 새로운 기본 동작을 구별하는 역할을 했을 뿐만 아니라 NextSTEP(및 다른 Objective-C 클래스 라이브러리)에서 사용된 원래 기본 클래스인 Object를 사용한 코드와 동일한 런타임에 공존할 수 있도록 했습니다(몇 가지 제한 사항이 있음).두 개의 문자 접두사 도입도 Objective-C에는 없는 단순한 네임스페이스 형태가 되었습니다.비공식 포장 식별자를 만들기 위해 접두사를 사용하는 것은 Objective-C 커뮤니티에서 비공식 코딩 표준이 되어 오늘날까지 이어지고 있다.

최근에는 패키지 매니저와 패키지의 저장소 모두를 목표로 하는 코코아팟과 같은 패키지 매니저가 등장하기 시작했다.지난 몇 년 동안 작성된 많은 오픈 소스 Objective-C 코드는 이제 코코아팟을 사용하여 설치할 수 있습니다.

언어 분석

Objective-C 구현에서는 C로 작성된[citation needed]런타임 시스템을 사용합니다.이것에 의해, 애플리케이션의 사이즈는 거의 추가되지 않습니다.반면 생성 당시 대부분의 개체 지향 시스템은 대규모 가상 시스템 런타임에 사용되었습니다.Objective-C로 작성된 프로그램은 코드 크기나 라이브러리의 크기(일반적으로 소프트웨어 배포에 포함할 필요가 없음)보다 크지 않은 경향이 있습니다.이는 창을 여는 데만 대량의 메모리가 사용되었던 Smalltalk 시스템과 대조됩니다.Objective-C 동적 입력에서는 메서드를 제거하거나 인라인화할 수 없기 때문에 Objective-C 어플리케이션은 유사한 C 어플리케이션이나 C++ 어플리케이션보다 큰 경향이 있습니다.프로그래머는 콜을 위임, 전송, 셀렉터를 즉석에서 빌드하여 런타임시스템에 전달할 수 있기 때문에 Objective-C 컴파일러는 사용하지 않는 메서드를 삭제하거나 인라인 콜에 대해 안전하다고 간주할 수 없습니다.

마찬가지로 이 언어는 새로운 컴파일러가 아닌 기존 C 컴파일러(GCC 내, 처음에는 프리프로세서로서, 다음에는 모듈로서) 위에 구현할 수 있습니다.이를 통해 Objective-C는 C 코드, 라이브러리, 도구 등의 방대한 기존 컬렉션을 활용할 수 있습니다.기존 C 라이브러리를 Objective-C 래퍼로 랩하여 OO 스타일의 인터페이스를 제공할 수 있습니다.에서 GTK 어플리케이션 개발에 널리 사용되는 GObject 라이브러리 및 Vala 언어와 유사합니다.

이러한 모든 실질적인 변화는 진입 장벽을 낮추었는데, 1980년대에 Smalltalk가 널리 받아들여진 가장 큰 문제일 것이다.

일반적인 비판은 Objective-C가 네임스페이스에 대한 언어를 지원하지 않는다는 것입니다.대신 프로그래머는 클래스 이름에 프레픽스를 추가해야 합니다.이것은 전통적으로 네임스페이스 이름보다 짧기 때문에 충돌이 발생하기 쉽습니다.2007년 현재, 코코아 프로그래밍 환경의 모든 macOS 클래스 및 함수 앞에는 "NSObject, NSButton"이 부가되어 macOS 또는 iOS 코어에 속하는 것으로 식별됩니다. "NS"는 NeXTSTEP 개발 중에 정의된 클래스의 이름에서 파생되었습니다.

Objective-C는 C의 엄밀한 슈퍼셋이므로 C 프리미티브타입은 퍼스트클래스 오브젝트로 취급하지 않습니다.

C++달리 Objective-C는 연산자 오버로드를 지원하지 않습니다.또한 C++와 달리 Objective-C에서는 오브젝트가 하나의 클래스에서만 직접 상속할 수 있습니다(복수 상속 금지).그러나 대부분의 경우 범주 및 프로토콜을 동일한 결과를 얻기 위한 대안 방법으로 사용할 수 있다.

Objective-C는 동적 런타임타입을 사용하기 때문에 모든 메서드콜이 함수콜(또는 경우에 따라서는 syscall)이기 때문에 많은 일반적인 퍼포먼스 최적화를 Objective-C 메서드에 적용할 수 없습니다(인라인화, 지속적인 전파, 프로시저 간 최적화, 집약의 스칼라 치환 등).따라서 최적화가 가능한 C++와 같은 언어의 유사한 추상화에 대해 Objective-C 추상화의 성능이 제한됩니다.

메모리 관리

Objective-C의 첫 번째 버전은 가비지 수집을 지원하지 않았습니다.당시 이 결정은 논쟁의 여지가 있었고, 많은 사람들은 (Smalltalk가 수집을 수행했을 때) 긴 "데드 타임"으로 인해 시스템 전체를 사용할 수 없게 된다고 생각했다.일부 서드파티 구현에서는 이 기능이 추가되었으며(특히 Boehm을 사용하는 GNUstep), Apple은 Mac OS X v10.[56]5에서 이 기능을 구현했습니다.그러나 최신 버전의 macOS 및 iOS에서는 가비지 컬렉션이 2011년에 도입된 자동 참조 카운트(ARC)를 위해 폐지되었습니다.

ARC를 사용하면 컴파일러는 정적 코드 분석을 기반으로 유지 및 해제 콜을 Objective-C 코드에 자동으로 삽입합니다.자동화를 통해 프로그래머는 메모리 관리 코드를 쓸 필요가 없어집니다.ARC는 Objective-C [57]언어에 대한 약한 참조도 추가합니다.

Objective-C와 C++의 철학적인 차이

C++와 Objective-C의 설계와 구현은 C 확장에 대한 근본적으로 다른 접근방식을 나타낸다.

C의 절차 프로그래밍 스타일 외에도 C++는 객체 지향 프로그래밍, 일반 프로그래밍메타프로그래밍의 특정 형식을 직접 지원합니다.또한 C++에는 여러 컨테이너 클래스가 포함대형 표준 라이브러리가 포함되어 있습니다.마찬가지로 Objective-C는 객체 지향 프로그래밍, 동적 타이핑 및 리플렉션을 C에 추가합니다.Objective-C는 그 자체로는 표준 라이브러리를 제공하지 않지만 Objective-C가 사용되는 대부분의 장소에서는 OpenStep같은 라이브러리와 함께 사용되며 C++의 표준 라이브러리와 유사한 기능을 제공합니다.

한 가지 주목할 만한 차이점은 Objective-C는 반사 기능을 위한 런타임 지원을 제공하는 반면 C++는 C에 적은 양의 런타임 지원만 추가한다는 것입니다.Objective-C에서는 오브젝트가 특정 메시지에 응답할 것인지 여부 등 오브젝트가 자신의 속성에 대해 쿼리할 수 있습니다.C++ 에서는, 외부 라이브러리를 사용하지 않는 한, 이것은 불가능합니다.

리플렉션의 사용은 언어의 동적(런타임) 기능과 정적(컴파일 타임) 기능 간의 광범위한 구별의 일부이다.Objective-C와 C++는 각각 두 기능을 혼합하여 사용하지만 Objective-C는 런타임 결정에 맞춰져 있는 반면 C++는 컴파일 시간에 맞춰져 있습니다.동적 프로그래밍과 정적 프로그래밍의 긴장은 프로그래밍의 많은 고전적인 트레이드오프를 수반합니다.동적 기능에는 유연성이 추가되고 정적 기능에는 속도와 유형 체크가 추가됩니다.

범용 프로그래밍과 메타프로그래밍은 런타임 다형을 사용하여 두 언어 모두에서 구현할 수 있습니다.C++에서는 가상함수와 런타임 유형 식별의 형태를 취하며 Objective-C는 동적 타이핑과 리플렉션을 제공합니다.Objective-C와 C++는 모두 컴파일 시간 다형성(일반 함수)을 지원하며 Objective-C는 2015년에만 이 기능을 추가합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Runtime Versions and Platforms". Developer.apple.com. Archived from the original on July 20, 2016. Retrieved December 24, 2017.
  2. ^ Lattner, Chris (June 3, 2014). "Chris Lattner's Homepage". Chris Lattner. Archived from the original on June 4, 2014. Retrieved June 3, 2014. The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
  3. ^ Singh, Amit (December 2003). "A Brief History of Mac OS X". Mac OS X Internals. Archived from the original on May 14, 2012. Retrieved June 11, 2012.
  4. ^ "App Frameworks". Apple. June 2014. Archived from the original on February 16, 2019. Retrieved February 13, 2019.
  5. ^ Garling, Caleb. "iPhone Coding Language Now World's Third Most Popular". Wired. Archived from the original on September 9, 2013. Retrieved May 20, 2013.
  6. ^ Wentk, Richard (2009). Cocoa: Volume 5 of Developer Reference Apple Developer Series. John Wiley and Sons. ISBN 978-0-470-49589-6. Archived from the original on February 16, 2017. Retrieved July 22, 2016.
  7. ^ Biancuzzi, Federico; Warden, Shane (2009). Masterminds of Programming. O'Reilly Media, Inc. pp. 242–246. ISBN 978-0-596-51517-1. Archived from the original on February 17, 2017. Retrieved July 22, 2016.
  8. ^ Cox, Brad (1983). "The object oriented pre-compiler: programming Smalltalk 80 methods in C language". ACM SIGPLAN Notices. New York, NY: ACM. 18 (1). doi:10.1145/948093.948095. S2CID 6975032. Retrieved February 17, 2011.
  9. ^ "Common Lisp and Readline". GitHub. Archived from the original on September 6, 2014. Retrieved September 15, 2014. The issue first arose when NeXT proposed to distribute a modified GCC in two parts and let the user link them. Jobs asked me whether this was lawful. It seemed to me at the time that it was, following reasoning like what you are using; but since the result was very undesirable for free software, I said I would have to ask the lawyer. What the lawyer said surprised me; he said that judges would consider such schemes to be "subterfuges" and would be very harsh toward them. He said a judge would ask whether it is "really" one program, rather than how it is labeled. So I went back to Jobs and said we believed his plan was not allowed by the GPL. The direct result of this is that we now have an Objective C front end. They had wanted to distribute the Objective C parser as a separate proprietary package to link with the GCC back end, but since I didn't agree this was allowed, they made it free.
  10. ^ "GNUstep: Introduction". GNUstep developers/GNU Project. Archived from the original on August 6, 2012. Retrieved July 29, 2012.
  11. ^ "Kresten Krab Thorup LinkedIn". www.linkedin.com. Archived from the original on July 15, 2014. Retrieved June 23, 2016.
  12. ^ "Write Objective-C Code". apple.com. April 23, 2013. Archived from the original on December 24, 2013. Retrieved December 22, 2013.
  13. ^ "Objective-C Boot Camp". Archived from the original on February 11, 2018. Retrieved February 11, 2018. Objective-C is a strict superset of ANSI C
  14. ^ "Examining Objective-C". Archived from the original on September 4, 2014. Retrieved September 4, 2014. Objective-C is an object-oriented strict superset of C
  15. ^ Lee, Keith (September 3, 2013). Pro Objective-C. Apress. ISBN 9781430250500. Archived from the original on May 14, 2018. Retrieved December 24, 2017 – via Google Books.
  16. ^ "Tags for Objective-C Headers". Archived from the original on April 1, 2017. Retrieved February 11, 2018. Objective-C is a superset of C
  17. ^ "AppScan Source 8.7 now available". Archived from the original on February 3, 2017. Retrieved February 11, 2018. The Objective-C programming language is a superset of the C programming language
  18. ^ Apple, Inc. (October 19, 2009). "Dynamic Method Resolution". Objective-C Runtime Programming Guide. Archived from the original on September 7, 2010. Retrieved November 25, 2014.
  19. ^ Apple, Inc. (October 19, 2009). "Avoiding Messaging Errors". The Objective-C Programming Language. Archived from the original on September 8, 2010.
  20. ^ "objc_msgSend - Objective-C Runtime". Apple Developer Documentation. Retrieved February 10, 2020.
  21. ^ "Messaging with the GNU Objective-C runtime". Using the GNU Compiler Collection (GCC). Retrieved February 10, 2020.
  22. ^ "Category". Apple Developer (Cocoa Core Competencies).
  23. ^ Dalrymple, Mark; Knaster, Scott (June 27, 2012). Learn Objective-C on the Mac. p. 9. ISBN 9781430241881. The .m extension originally stood for "messages" when Objective-C was first introduced, referring to a central feature of Objective-C
  24. ^ "Objective-C Runtime Programming Guide". Apple Inc. Archived from the original on April 4, 2014. Retrieved October 21, 2013.
  25. ^ "ACM SIGGRAPH 1983 Issue 8 - Smalltalk". Archived from the original on 15 April 2009. Retrieved 7 October 2008.
  26. ^ "Extension Methods (C# Programming Guide)". Microsoft. October 2010. Archived from the original on July 11, 2011. Retrieved July 10, 2011.
  27. ^ "Using C++ With Objective-C". Mac OS X Reference Library. Archived from the original on September 5, 2010. Retrieved February 10, 2010.
  28. ^ "Clang Language Extensions — Clang 3.5 documentation". Clang.llvm.org. Archived from the original on February 24, 2014. Retrieved April 16, 2014.
  29. ^ "Objective-C 2.0: more clues". Lists.apple.com. August 10, 2006. Archived from the original on June 18, 2009. Retrieved May 30, 2010.
  30. ^ "Re: Objective-C 2.0". Lists.apple.com. Archived from the original on November 24, 2010. Retrieved May 30, 2010.
  31. ^ a b "GCC 4.6 Release Series — Changes, New Features, and Fixes : GNU Project : Free Software Foundation". Gcc.gnu.org. Archived from the original on January 5, 2018. Retrieved December 24, 2017.
  32. ^ a b c d "ObjC2 FAQ". GNUstep. Retrieved January 6, 2020.
  33. ^ "Source Browser: objc4, 756.2". Apple Open Source. Retrieved January 6, 2020.
  34. ^ 가비지 컬렉션 프로그래밍 가이드: 가비지 컬렉션 API 2012년 6월 9일 Wayback Machine에서 아카이브(Apple 개발자 웹사이트 - "_strong" 검색)
  35. ^ "Garbage Collection Programming Guide: Introduction to Garbage Collection". Apple Inc. October 3, 2011. Archived from the original on June 9, 2012. Retrieved December 23, 2011.
  36. ^ "Leopard Technology Series for Developers: Objective-C 2.0 Overview". Apple Inc. November 6, 2007. Archived from the original on July 24, 2010. Retrieved May 30, 2010.
  37. ^ "Transitioning to ARC Release Notes". Apple Inc. July 17, 2012. Archived from the original on June 9, 2012. Retrieved August 26, 2012.
  38. ^ Mike Ash. "Friday Q&A 2013-09-27: ARM64 and You". mikeash.com. Archived from the original on April 26, 2014. Retrieved April 27, 2014.
  39. ^ "Hamster Emporium: [objc explain]: Non-pointer isa". Sealiesoftware.com. September 24, 2013. Archived from the original on June 3, 2014. Retrieved April 27, 2014.
  40. ^ Apple, Inc. (2009). "Fast Enumeration". apple.com. Archived from the original on December 17, 2009. Retrieved December 31, 2009.
  41. ^ Free Software Foundation, Inc. (2011). "GCC 4.6 Release Series – Changes, New Features, and Fixes". Gcc.gnu.org. Archived from the original on December 2, 2013. Retrieved November 27, 2013.
  42. ^ "Blocks Programming Topics – Mac Developer Library". Apple Inc. March 8, 2011. Archived from the original on June 9, 2012. Retrieved November 28, 2012.
  43. ^ a b "Objective-C Automatic Reference Counting (ARC) — Clang 11 documentation". Clang documentation. Retrieved February 20, 2020. For now, it is sensible to version this document by the releases of its sole implementation (and its host project), clang. “LLVM X.Y” refers to an open-source release of clang from the LLVM project. “Apple X.Y” refers to an Apple-provided release of the Apple LLVM Compiler.
  44. ^ "Transitioning to ARC". Apple Inc. Archived from the original on September 7, 2011. Retrieved October 8, 2012.
  45. ^ "LLVM 3.0 Release Notes". releases.llvm.org.
  46. ^ a b "Programming with Objective-C: Values and Collections". Apple Inc. Archived from the original on September 7, 2011. Retrieved October 8, 2012.
  47. ^ "Clang 3.1 Release Notes". releases.llvm.org.
  48. ^ "Objective-C Literals — Clang 3.5 documentation". Clang.llvm.org. Archived from the original on June 6, 2014. Retrieved April 16, 2014.
  49. ^ Rhapsody Developer's Guide, AP Professional, 1997, pp. 76–84
  50. ^ "Portable Object Compiler". Users.pandora.be. January 1, 1970. Archived from the original on August 2, 2008. Retrieved May 30, 2010.
  51. ^ "Breadbox Computer Company LLC homepage". Archived from the original on July 27, 2011. Retrieved December 8, 2010.
  52. ^ "gcc/libobjc". GitHub. gcc-mirror. January 6, 2020. Retrieved January 6, 2020. he runtime has been completely rewritten in gcc 2.4. The earlier runtime had several severe bugs and was rather incomplete.
  53. ^ "GNU Objective-C runtime API". Using GCC. Retrieved January 6, 2020.
  54. ^ "WinObjC on GitHub". GitHub. Archived from the original on December 2, 2017. Retrieved February 13, 2018.
  55. ^ "GNUStep Installer". Archived from the original on February 17, 2018. Retrieved February 14, 2018.
  56. ^ Apple, Inc. (August 22, 2006). "Mac OS X Leopard – Xcode 3.0". apple.com. Archived from the original on October 24, 2007. Retrieved August 22, 2006.
  57. ^ "Transitioning to ARC Release Notes". iOS Developer Library. Developer.apple.com. Archived from the original on September 7, 2011. Retrieved April 16, 2014.

추가 정보

  • Cox, Brad J. (1991). Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.

외부 링크