programing

오브젝티브-C 대신 C++를 코코아와 함께 사용하시겠습니까?

megabox 2023. 5. 9. 22:12
반응형

오브젝티브-C 대신 C++를 코코아와 함께 사용하시겠습니까?

저는 애플이 카본 64비트를 지원하지 않기 때문에 C++과 코코아 프레임워크를 사용하는 애플리케이션을 작성하고 싶습니다.C++는 Linux와 Windows에서 구현할 때 꽤 바닐라한 것처럼 보이지만 Mac OS X에서는 추가적인 Apple 특정 코드 조각이 필요한 것 같습니다(Obj-C 래퍼와 같은).또한 애플이 개발자들에게 C++이 아닌 Objective-C로 작성하도록 강요하는 것처럼 보이지만, 제가 틀릴 수도 있습니다.

저는 맥에서 크로스 플랫폼을 유지하기 쉬운 코드를 작성할 수 있는 경로를 찾고 있습니다.리눅스/윈도우즈용 C++로 코드를 작성한 다음 목표-C에서 많은 부분을 다시 작성해야 하는 것은 매우 비효율적입니다.

미래에 지원되고 Xcode에서 지원될 C++로 코드를 작성하는 방법이 있습니까?또한 이것이 가능하다면 Xcode에서 C++과 Objective-C를 어떻게 혼합해야 합니까?감사해요.

코코아 애플리케이션을 C++로만 작성할 수는 없습니다.Cocoa는 키-값 바인딩, 대리인(Cocoa 스타일) 및 대상-액션 패턴과 같은 많은 핵심 기술을 위해 Objective-C의 늦은 바인딩 기능에 크게 의존합니다.늦은 바인딩 요구 사항으로 인해 C++ 컴파일 시간 제한 언어로 코코아 API를 구현하는 것이 매우 어렵습니다.물론, 당신은 OS X에서 실행되는 순수한 C++ 앱을 작성할 수 있습니다.코코아 API를 사용할 수 없습니다.

따라서 다른 플랫폼의 C++ 앱과 코코아 기반 애플리케이션 간에 코드를 공유하려면 두 가지 옵션이 있습니다.첫 번째는 C++로 모델 레이어를 작성하고 코코아로 GUI를 작성하는 것입니다.이것은 Mathematica를 포함한 일부 매우 큰 앱에서 일반적으로 사용되는 접근 방식입니다.C++ 코드는 변경되지 않은 채로 유지할 수 있습니다(OS X에서 C++를 쓰거나 컴파일하기 위해 "펑키한" 애플 확장자가 필요하지 않습니다).컨트롤러 계층은 Objective-C++(아마도 "펑키한" Apple 확장자)를 사용할 것입니다.Objective-C가 C의 상위 집합인 것처럼 Objective-C++는 C++의 상위 집합입니다.Objective-C++에서, 당신은 통화를 전달하는 objc 스타일의 메시지를 만들 수 있습니다.[some-objc-object callMethod];에서. C++ 함수 내에서 생성됩니다.반대로 다음과 같이 ObjC 코드 내에서 C++ 함수를 호출할 수 있습니다.

@interface MyClass {
    MyCPPClass *cppInstance;
}
@end

@implementation MyClass
- (id)init {
    if(self = [super init]) {
        cppInstance = new MyCPPClass();
    }
    return self;
}
- (void) dealloc {
    if(cppInstance != NULL) delete cppInstance;
    [super dealloc];
}
- (void)callCpp {
    cppInstance->SomeMethod();
}
@end

Objective-C++에 대한 자세한 내용은 Objective-C 언어 가이드를 참조하십시오.그러면 뷰 도면층이 순수 목적-C가 될 수 있습니다.

두 번째 옵션은 크로스 플랫폼 C++ 툴킷을 사용하는 것입니다.Qt 툴킷이 청구서에 맞을 수도 있습니다.교차 플랫폼 툴킷은 세부 정보를 정확하게 파악하지 못하고 Mac 사용자가 Mac 애플리케이션의 UI에서 세련됨을 기대하기 때문에 일반적으로 Mac 사용자에게 경멸을 받습니다.하지만 Qt는 놀라울 정도로 잘 해내고, 청중과 앱 사용에 따라 충분히 좋을 수도 있습니다.또한 Qt API에 대략적인 대체 기능이 있지만 Core Animation 및 일부 QuickTime 기능과 같은 OS X 관련 기술을 사용할 수 없습니다.지적하신 대로 Carbon은 64비트로 포팅되지 않습니다.Qt가 Carbon API에 구현되었기 때문에 Trolltech/Nokia는 64비트 호환을 위해 Qt를 Cocoa API로 포팅해야 했습니다.제가 알기로는 Qt의 다음 릴리스(현재 출시 후보)는 이 전환을 완료하고 OS X에서 64비트 호환됩니다. C++과 코코아 API를 통합하는 데 관심이 있다면 Qt 4.5의 소스를 살펴보는 것이 좋습니다.


◦ 한동안 Apple은 Java에서 Cocoa API를 사용할 수 있도록 했지만 브리지는 광범위한 수동 조정이 필요했고 위에서 설명한 키-값 바인딩과 같은 고급 기술을 처리할 수 없었습니다.현재 동적으로 유형화된 Python, Ruby 등과 같은 런타임 바인딩 언어는 Objective-C 없이 코코아 앱을 작성할 수 있는 유일한 실제 옵션입니다(물론 이러한 브리지는 Objective-C를 후드 아래에서 사용합니다).

바보같이 들릴 수도 있지만, 실제로 우리는 순수한 C++ 코드를 작성하여 Mac OS X용 GUI를 만들 수 있지만, 우리는 코코아 프레임워크와 연결해야 합니다.

/*
 * test1.cpp
 * This program shows how to access Cocoa GUI from pure C/C++
 * and build a truly functional GUI application (although very simple).
 * 
 * Compile using:
 *   g++ -framework Cocoa -o test1 test1.cpp
 *
 * that will output 'test1' binary.
 */


#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include <iostream>

extern "C" int NSRunAlertPanel(CFStringRef strTitle, CFStringRef strMsg,
                               CFStringRef strButton1, CFStringRef strButton2, 
                               CFStringRef strButton3, ...);


int main(int argc, char** argv)
{
    id app = NULL;
    id pool = (id)objc_getClass("NSAutoreleasePool");
    if (!pool)
    {
        std::cerr << "Unable to get NSAutoreleasePool!\nAborting\n";
        return -1;
    }
    pool = objc_msgSend(pool, sel_registerName("alloc"));
    if (!pool)
    {
        std::cerr << "Unable to create NSAutoreleasePool...\nAborting...\n";
        return -1;
    }
    pool = objc_msgSend(pool, sel_registerName("init"));

    app = objc_msgSend((id)objc_getClass("NSApplication"),
                       sel_registerName("sharedApplication"));

    NSRunAlertPanel(CFSTR("Testing"),
                    CFSTR("This is a simple test to display NSAlertPanel."),
                    CFSTR("OK"), NULL, NULL);

    objc_msgSend(pool, sel_registerName("release"));
    return 0;
}

예, C++(*.cpp 파일에 기록)을 사용하고 *.mm 파일 안에 C++와 Objective-C를 혼합할 수도 있습니다(표준 Objective-C 코드는 *.m 파일에 저장됨).

물론 사용자 인터페이스에 대해 Objective-C를 사용하고 C++ 개체에 대해 Objective-C 래퍼를 만들어야 합니다.또 다른 옵션은 Windows, Mac OS X 및 Linux를 지원하는 C++ 프레임워크인 Qt로 전환하는 것입니다. 이 프레임워크는 다음 버전 4.5에서 LGPL로 출시될 예정입니다.

네, 섞을 수 있습니다.

목표-C를 사용하여 GUI 개체에서 직접 작동하고 해당 개체로부터 알림을 받아야 합니다.

이러한 Objective-C 개체는 순수 Objective-C.m 파일 대신 .mm 파일에 넣으면 C++ 논리를 직접 호출할 수 있습니다.대문자 사용을 제안하는 오래된 조언이 표시될 수 있습니다.M은 목표-C++를 나타내지만 이것은 매우 불안정하며 컴파일러뿐만 아니라 당신을 혼란스럽게 할 가능성이 있습니다.

모든 C++ 개체를 줄로 묶을 필요는 없지만 Objective-C 코드에는 개체에 대한 포인터가 포함되어 있어야 합니다.

Apple은 더 이상 이 방법을 보여주는 샘플을 게시하지 않습니다.

Realm [Objective] C++에서 진행되는 피터 스타인버거의 훌륭한 비디오가 있습니다: 무엇이 잘못될있을까요?저는 아직 오브젝티브-C++을 사용하는 사람에게 적극 추천하며, 당신은 빠르게 대본을 훑어볼 수 있습니다.

플레인 바닐라 C++을 사용하려는 경우 이는 전적으로 지원되며 다른 플랫폼과 다를 바 없습니다.Xcode는 파일 > 새 프로젝트 > 명령줄 유틸리티 > C++ 툴 아래에 템플릿도 있습니다.또한 많은 인기 있는 오픈 소스 라이브러리(libcurl, libxml2, sqlite 등)는 OS X와 함께 제공되며 동적 링크를 위해 사용할 수 있습니다.당신이 원하지 않는다면 코코아나 애플 특유의 것을 사용할 필요가 없습니다.

당신이 당신의 앱의 특정 부분에서 코코아를 사용하고 싶다면, 목표-C++을 보세요.C++와 Objective-C를 동일한 파일에 .mm의 확장자를 지정하거나 Xcode의 파일을 마우스 오른쪽 단추로 클릭하여 Get Info > General을 선택한 다음 File Type을 sourcecode.cpp.objcpp로 변경하여 동일한 파일에 C++과 Objective-C를 혼합할 수 있습니다.두 번째 옵션은 Mac별 #ifdef 내에서 Objective-C를 사용하려는 .cpp 파일이 있는 경우 유용합니다.

이건 오래된 질문이지만...

저는 몇몇 코코아 수업의 C++ 포장지를 만들기 위해 노력했습니다.

그것은 꽤 좋은 경험이었습니다.C++는 Objective-C보다 더 나은 형식 안전성을 제공했고 코드를 덜 쓰도록 만들었습니다.그러나 컴파일 시간과 메모리 안전성은 더 좋지 않습니다.가능하지만 일부 동적 기반 기능은 처리하기가 쉽지 않았습니다.C++로 처리하는 것은 말이 안 된다고 생각합니다.

어쨌든 스위프트의 발표로 인해 저의 프로젝트는 결국 포기되었습니다.처음에 C++을 사용하고 싶었던 이유를 모두 지워주었고, 더 많은 것과 더 나은 것을 제공합니다.

코드를 사용하여 모든 것을 그리는 것과 같은 순수한 그래픽 응용 프로그램을 작성하는 경우 openFrameworks를 고려하십시오.C/C++ 위에 구축된 오픈 소스 그래픽 프로그래밍 언어입니다.그것은 사람들이 언어를 확장할 수 있게 해주는 추가 기능을 가지고 있습니다.그들은 아이폰용 애드온을 가지고 있습니다.저는 그것이 도서관과 XCode 프로젝트와 함께 제공되어 아이폰과 아이팟 터치용 앱을 컴파일하는 데 도움이 될 것이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/525609/use-c-with-cocoa-instead-of-objective-c

반응형