我在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 ++警告。
答案 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];
这样,一切都得到了正确的保留。
快乐编码〜