在文件范围内声明和实现之间的差异



我是Objective-C的新手,我在浏览代码时遇到了这个:

@implementation ThreadManager
@synthesize bridge = _bridge;
NSMutableDictionary *threads;

我可以这样写吗:

@implementation ThreadManager {
NSMutableDictionary *_threads;
RCTBridge *_bridge;
}

也可以有人看看代码,请让我知道如果@synthesize bridge = _bridge;实际上被使用?我认为这是多余的。

在这两种情况下,这是不同的事情。

@synthesize创建访问器(-bridge-setBridge:)。在@implementation中声明ivar不能。

@synthesize的这种样式在今天并不常见,而且通常是不必要的(正如所写的,它几乎肯定是该属性的默认值)(*)。但它没有被@implementation变量所取代。它被什么都没有取代。你只需要声明@property。也就是说,它不会伤害任何东西。详细信息请参见声明属性。

(*)我查了你引用的代码,我知道为什么他们使用@sythesizebridge是在协议中声明的,而不是直接在接口中声明的,所以在这种情况下需要它。

threads这里是一个类变量,由ThreadManager的所有实例共享(更典型的是让这些static,但它不是强制性的;在这种形式下,它实际上只是一个全局变量,但实际上这是一回事)。这不是真正的Objective-C的东西。它的工作原理就像普通的c语言。你修改的代码使它成为一个实例变量,这是不同的。

@implementation中声明变量在现代ObjC中很少见。多年来我这么做的唯一原因是在暴露纯objc接口的对象中保存c++属性,或者非常偶然地保存我想直接操作的私有C类型(没有访问器)。@property语法要好得多,也更常用。

相关内容

最新更新