【问题标题】:What is the effect of having a static struct from C imported into Objective-C?将 C 中的静态结构导入到 Objective-C 有什么影响?
【发布时间】:2019-09-03 23:36:11
【问题描述】:

我正在调试旧版应用,遇到以下情况

LegacySource.h
cFunctionModifyingSomeVariable()

LegacySource.c
static struct someVariable; //a custom struct


ObjectiveCImplementation.m
#import LegacySource.h
-(void)workWithLegacy {
   cFunctionModifyingSomeVariable(); // modifies variable declared in C class
}

将 C 中的静态结构导入到 Objective-C 有什么影响?

我所有的 Objective-C 类是否共享静态结构的同一个实例,或者每个实例都有自己的实例?换句话说,如果我创建了 3 个 ObjectiveCImplementation 实例,它们会修改同一个变量,还是它们的效果会相互独立?

【问题讨论】:

  • 仅供参考 - 答案与在任意数量的 .c 文件中包含 LegacySource.h 没有什么不同。

标签: c objective-c inheritance struct static-variables


【解决方案1】:

Objective-C 代码根本不适用于someVariable。它只是调用一个函数。静态结构没有“导入”到 Objective-C,不管这意味着什么。

在任何情况下,变量someVariable 都是单数的。只有一个这样的变量。无论从哪里调用cFunctionModifyingSomeVariable(),它仍然只适用于那个变量。该 C 函数不了解 Objective-C 类的实例,或者更一般地说,不了解其调用者的任何信息,因此其行为不会因此而有所不同。

【讨论】:

  • 谢谢!从变量中删除静态会导致多个 Objective-C 实例通过修改单个变量停止相互干扰吗?
  • 没有。非静态文件范围变量仍然是单数;只是它具有外部联系。这意味着它可以通过 LegacySource.c 以外的模块中的代码直接访问(如果它们声明了它)。此外,具有外部链接的变量实际上位于全局名称空间中,因此如果没有static,它可能会开始与具有外部链接的其他同名变量发生名称冲突。
  • 为了使不同的对象不会相互干扰,您将不得不使 C API 面向对象。例如,考虑各种核心基础类型,如CFArrayCFDictionary。这些仍然是 C API,但每个函数都有一个参数来指示它应该对哪个对象进行操作。
  • 我将研究通过函数参数将对象带入 C 函数中,或者如果可能的话,将逻辑从 C 类移到 Objective-C 实现文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 2015-10-23
  • 2011-03-02
  • 2011-06-25
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多