Objective C 在 C++ 中作为实例变量的对象 类

Objective C objects as instance variables in C++ classes

我正在尝试修改 C++ class,使 Objective C 对象成为其实例变量之一。

从本质上讲,这道题就像这样:C++ classes as instance variables of an Objective-C class

头文件 MyCPPClass.h 如下所示:

namespace my_namespace{

    class MyCPPClass: public my_namespace::OperationHandler {
     public:
         void someFunc();

     private:
         void otherFunc();
    };
}

MyCPPClass.mm 文件如下所示:

#include "MyCPPClass.h"
#import <Foundation/Foundation.h>

void my_namespace:: MyCPPClass:: someFunc() {
    NSLog(@"I can run ObjC here! Yahoo!");

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"download_url_goes_here"]];
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
   // handle the data
   }];

}

void my_namespace:: MyCPPClass:: otherFunc() {
    NSLog(@"I can run ObjC here! Yahoo!");
}

这里的问题是我需要存储对在 someFunc() 中创建的对象的引用,然后在 otherFunc() 中使用它。该对象是 NSURLSessionTask 的一个实例。我在 C++ 方面的背景非常有限:(。执行此操作的侵入性最小的方法是什么?

我相信你可以根据这个Pass an Objective-C object to a function as a void * pointer

将它存储为 void*

所以你的 header 会变成:

namespace my_namespace{

    class MyCPPClass: public my_namespace::OperationHandler {
        public:
            void someFunc();

        private:
            void otherFunc();
            void *mySessionTask;
    };
}

如果你想向它发送消息,你首先要将它转换回它应该是的样子:

[(NSURLSessionTask*)mySessionTask someMessageWithArg: foo]