我可以在统一包装器中调用包含块的iOS代码吗?

时间:2015-06-03 23:00:15

标签: c++ ios objective-c unity3d wrapper

我在Objective-C中有一个方法,它进入NSOperationQueue并与一个块异步返回。

例如

+ (void)getDataFromServer:(void(^)(NSArray *data, NSError *error))block;

所以当我尝试使用Objective-C ++包装器调用它时,

void get_data(const char *GameObjectName, const char *DataCallback,const char *ErrorCallback){
    [LibraryClass getDataFromServer:^(NSArray *data, NSError *error) {
        if (data) {
             UnitySendMessage(GameObjectName, DataCallback, [[data componentsJoinedByString:@","] UTF8String]);
        }
        if (error) {
            UnitySendMessage(GameObjectName, ErrorCallback, [[error localizedDescription] UTF8String]);
        }
    }];
}

如果我在阻塞之前断点,则字符串(const char *)填充正常,但如果我在块的if (data) {}部分中断点,那么变量就会被填充,看起来像随机数据。当然,UnityMessageSend()失败,因为无法找到该对象。

我是以正确的方式来做这件事的吗?我怀疑我已经忘记或不知道某些阻止/ C / C ++警告。

2 个答案:

答案 0 :(得分:2)

理想情况下,您要发布- [MyClass getDataFromServer:]的实现,但至少您希望按照@nielsbot的建议进行操作,并使用-copy将堆从堆栈复制到堆中:< / p>

void get_data(const char *GameObjectName, const char *DataCallback,const char *ErrorCallback){
    [LibraryClass getDataFromServer:[^(NSArray *data, NSError *error) {
        if (data) {
             UnitySendMessage(GameObjectName, DataCallback, [[data componentsJoinedByString:@","] UTF8String]);
        }
        if (error) {
            UnitySendMessage(GameObjectName, ErrorCallback, [[error localizedDescription] UTF8String]);
        }
    } copy]];   // <-- call the block's -copy method here
}

答案 1 :(得分:0)

CoreInt Slack Channel中的Erik价格解决了,但我想我会在这里写下来:

我们通过在类

上引用来解决这个问题

@property (nonatomic, copy) void (^myBlock)(NSError *error);

然后在通话时初始化

self.myBlock = ^{...}; 然后这样称呼它 [MyClass getDataFromServer:self.myBlock];

这样,一切都得到了正确的保留。

快乐编码〜