Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C-从宏定义的调用方法_Objective C_Swift_React Native_Native Module_React Native Native Module - Fatal编程技术网

Objective c 目标C-从宏定义的调用方法

Objective c 目标C-从宏定义的调用方法,objective-c,swift,react-native,native-module,react-native-native-module,Objective C,Swift,React Native,Native Module,React Native Native Module,我试图从Objective-C调用一个方法,该方法是使用一个封装Swift函数的宏定义的。当我试图调用我的方法时,我得到了一个编译错误:NearbyMessages的No visible@interface在Xcode中声明了选择器“\uu rct\u export\uu disconnect” 我的Swift函数如下所示: //斯威夫特 @objc 功能断开->无效{ //在这里断开逻辑 } Objective-C代码如下所示: //SomeInterface.m @接口RCT\u外部\u重新

我试图从Objective-C调用一个方法,该方法是使用一个封装Swift函数的宏定义的。当我试图调用我的方法时,我得到了一个编译错误:NearbyMessages的No visible@interface在Xcode中声明了选择器“\uu rct\u export\uu disconnect”

我的Swift函数如下所示:

//斯威夫特 @objc 功能断开->无效{ //在这里断开逻辑 } Objective-C代码如下所示:

//SomeInterface.m @接口RCT\u外部\u重新映射\u模块MeInterfaceNameJS,SomeInterfaceNamePrivate,NSObject RCT_外部_方法断开; -无效{ [self _rct _export _disconnect];//对于“NearbyMessages”,没有可见的@interface声明选择器“_rct _export _disconnect” NSLog@GNM_BLE:无效!; } @结束 React的RCTBridgeModule.h中的宏RCT_EXTERN_方法定义为:

定义RCT\u外部\u方法\ _RCT\u外部重新映射\u方法,方法,编号 定义(RCT)(EXTERN)(REMAP)(REMAP)(方法)js(名称),方法(方法)40\ +const RCT methodinfo*RCT\u CONCAT\u RCT\u export\u,RCT\u CONCATjs\u name,RCT\u CONCAT\u LINE\u,\u计数器{\ 静态RCTMethodInfo config={js_name,method,is_blocking_synchronous_method}\ 返回&配置\ } 通过阅读本文,在编译时应该调用该方法_rct_export__disconnect,对吗


那么,为什么不能使用[self\uuu rct\u export\uuu disconnect]——否则我如何调用此方法?

TL;DR:要回答这个问题,请调用[self.class uu rct u export uu disconnect];。但是,如果React Native的下一个版本中的_rct_export__前缀发生变化,那么直接调用disconnect函数是更好的方法,也是唯一一种经得起未来考验的方法

Objective-C允许有两种主要的方法

第一种类型是instance方法,它对Objective-C类的实例进行操作。在这个方法的主体中,self是一个指向堆上对象实例的指针,因此名为self。通过self指针,您可以访问其他实例方法、实例变量等。它在开头用减号声明/定义

第二种类型是类方法,它对具有特定Obj-C构造的类对象进行操作。当您在其他语言中使用静态函数时,它最常用,当然还有一些与继承相关的注意事项和怪癖。在该方法的主体中,self是指向类对象的指针。通过它,您可以调用其他类方法,但无法访问该对象的任何具体实例

这种差异得到了很好的解释

在您的情况下,此宏定义了一个类方法:

#define _RCT_EXTERN_REMAP_METHOD(js_name, method, is_blocking_synchronous_method) \
  + (const RCTMethodInfo *)RCT_CONCAT(__rct_export__, RCT_CONCAT(js_name, RCT_CONCAT(__LINE__, __COUNTER__))) { \
    static RCTMethodInfo config = {#js_name, #method, is_blocking_synchronous_method}; \
    return &config; \
  }
此方法是一种实例方法:

- (void)invalidate {
    [self __rct_export__disconnect];   // No visible @interface for 'NearbyMessages' declares the selector '__rct_export__disconnect'
    NSLog(@"GNM_BLE: invalidate!");
}

当您调用[self\uu rct\u export\uu disconnect];]从instance方法中,self指向类的实例。__rct_export__disconnect被定义为一个类方法see macro,因此它没有在对象的实例上定义。

这是一个非常好的答案,将其标记为已接受-但是如果有人遇到相同的问题,我刚刚发现,也可以在Swift中创建invalidate func并将其公开给Objective-C@objc@mrousavy,您是否有一个将Swift函数公开给Objective-C的示例?因为这就是我们在这个问题上所要做的,几行代码真是太神奇了!谢谢