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

Objective C - Call Method defined from a Macro

我正在尝试从 Objective-C 调用方法,该方法是使用包装 Swift 函数的宏定义的。不过,当我尝试调用我的方法时,我在 Xcode 中遇到了编译错误 No visible @interface for 'NearbyMessages' declares the selector '__rct_export__disconnect'

我的 Swift 函数如下所示:

// SomeInterface.swift

@objc
func disconnect() -> Void {
    // (disconnect logic here)
}

Objective-C 代码如下所示:

// SomeInterface.m
@interface RCT_EXTERN_REMAP_MODULE(SomeInterfaceNameJS, SomeInterfaceNamePrivate, NSObject)

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

@end

RCT_EXTERN_METHOD(来自React的RCTBridgeModule.h)定义为:

#define RCT_EXTERN_METHOD(method) \
  _RCT_EXTERN_REMAP_METHOD(, method, NO)

#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; \
  }

通过阅读本文,在编译时应该调用方法 __rct_export__disconnect,对吗?

那么为什么不能使用 [self __rct_export__disconnect] - 我还能如何调用此方法?

TL;DR:要回答问题,请致电 [self.class __rct_export__disconnect];。但更好的方法是直接调用 disconnect() 函数 disconnect() 函数。


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

第一种是实例方法,它对Objective-Cclass的一个实例进行操作。在此方法的主体中,self 是指向堆上对象实例的指针,因此得名。通过self指针可以访问其他实例方法、实例变量等。它是declared/defined,开头有减号(-)。

第二种是class方法,它作用于class对象(一个特定的Obj- C构造)。当您在其他语言中使用静态函数时最常使用它(当然有一些与继承相关的警告和怪癖)。在此方法的主体中,self 是指向 class 对象 的指针。通过它,您可以调用其他 class 方法,但您 无权访问 对象的任何具体实例。

区别解释的很好here


在你的例子中,这个宏定义了一个 class 方法:

#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 __rct_export__disconnect];] 时,self 指向您的 实例 class。 __rct_export__disconnect 被定义为 class 方法(参见宏),因此它没有在对象的实例上定义。