https://developer.apple.com/videos/play/wwdc2022/10160/

Metal-cpp는 메탈과 cpp를 연결한다. lower overhead 라이브러리이다.
Metal은 Object-C 기반으로 작성된다. 그래서 C++ 기반의 소스 코드를 연결하려면 metal-cpp로 연결해야한다.

메탈-cpp의 특징 : 모두 헤더로 이루어진 라이브러리라 가볍다. C++ 명령어가 metal api와 모두 연결되어있다. 일부 파운데이션이나 코어애니메이션 라이브러리가 호환된다. 오픈 소스로 열려 있다.

metal-cpp를 웹사이트에서 다운로드 한다.
header search path에 metal-cpp 폴더를 넣는다.

C++17 활성화

아래 세가지 프레임워크 추가

define 매크로와 헤더 파일을 추가하면 사용 가능!


기존 Object-C에서 참조를 카운트 하는 방법은 수동(MRR)과 자동(ARC)로 나뉨.
Metal-cpp에서는 수동으로 메모리를 관리해줘야함. 따라서 Cocoa conventions(룰)을 알고 언제 객체를 생성하고 해제해야하는 지 알아야한다.

소유권을 가지고 있지 않은 객체는 해제하면 안되는데 더블 프리(이미 해제한 객체를 또다시 해제)할 수 있는 위험이 있기 때문이다.

autorelease를 사용하면 객체가 필요할 때까지 객체를 완전히 해제 하지 않고(retain count가 줄어들지 않음) 더이상 필요하지 않을 때 해제함.
하지만 autorelease 이후 더 이상 해당 객체를 소유하는 클래스가 없다면 그 객체를 누가 관리할까?
-> autoreleasePool이 관리함!
(소유권을 가지지 않는 임시 객체도 autoreleasePool이 관리함)

Metal이 생성한 자동해제 객체는 Auto releasePool에 들어감.


이 두가지 유틸을 사용하면 메모리 해제 후 접근 하는 문제를 관리할 수 있음.

C++의 정확한 shared_ptr와는 다르다. rc를 저장할 때 추가 비용이 들지 않는다.

TransferPtr과 RetainPtr로 나뉜다.

new로 만든 객체는 내가 소유권을 소유하기 때문에 스스로 릴리즈 해야함.

하지만 TransferPtr을 사용하면 릴리즈 코드를 사용하지 않아서 SharedPtr이 객체를 관리함.
NSZombie를 활성화하면 메모리 해제후 사용하는 중단점에서 트리거 되서 디버깅 코드를 콘솔에 출력해 줌.

Xcode에서 활성화 하는 방법

콘솔 출력


Adapter 패턴
C++이나 ObjectC로 어댑터 클래스를 생성하면됨

__bridge, __bridge_retained, __bridge_transfer을 어댑터 클래스에 사용하여 서로 캐스팅

소유권 이전 양식에 따라 키워드를 다르게 사용한다.
