0

我尝试通过 2 种方式将全局变量的值从 .m 获取到另一个 .m:

首先,我尝试将 viewController.m 类导入另一个 .m 类并尝试检索该值,但我收到了链接器错误。

其次,我只是用字符串名称创建了 extern,然后它就开始正常工作了。

我的问题是为什么 import 给了我错误以及 extern 变量如何识别该特定类的字符串名称?
(即:如果我在不同的类中有 2 或 3 个具有相同名称的变量,并且我输入 extern 和字符串名称,我会得到哪个值,因为我没有导入任何类。)

而且,附加问题:您何时真正导入课程?

4

3 回答 3

1

当您需要访问它的属性和方法时,您真正导入了一个类。这听起来可能太明显了,但事实就是如此。类是 OOP 的封装概念的化身。

可以通过多种方式将变量从一个点传递到另一个点,一种可以使用 userdefaults 工具,您可以在应用程序委托中拥有该变量,然后在不同的类中访问该值,或者您可以在目标视图控制器上公开一个属性并让源视图控制器在转换到目标之前设置该属性..仅举几例。根据场景的不同,还有更多正确和错误的方法。

将视图控制器 A 导入另一个视图控制器 B,只是为了访问 A 中的值似乎有点矫枉过正(如果不是完全不恰当地使用导入机制)。

这个问题进一步解释了externs,我没有接触过他们,

Objective-C 静态、外部、公共变量

希望这可以帮助。

于 2013-01-13T03:56:47.067 回答
0

我知道这已经得到了详细的回答,但我只想提供一些澄清。

在 .m 文件中声明要保密的数据。对于您希望其他对象可以访问的数据,请在您的头.h文件中声明。为所有声明使用属性:

  //myViewController.h
  @interface myViewController: UIViewController

  @property (assign) int myInt;
  @property (strong) NSString* someString;

  @end

您可以通过将消息传递给 myViewController 从另一个对象访问这些属性:

  [myViewController setMyInt:20];    //setter
  [myViewController someString];    //getter

或者您可以使用等效的点符号

  myViewController.myInt = 20;
  myViewController.someString;

(您需要#include "myViewController.h"在任何想要访问这些的对象中)

在 myViewController 中,您可以使用“self”访问它们:

  self.myInt;
  self.someString;

这是通过 setter/getter 的中介访问。支持变量可以直接从 myViewController 内部(但不能从任何其他对象)访问,如_myInt, _someString。在 init 和 dealloc 方法之外不建议这样做。

属性封装了实例变量的声明默认getter和setter的创建,所以你不需要单独声明变量,如果你需要改变默认行为,你只需要制作自己的访问器。

另请参阅我的回答:
我应该在接口中声明变量还是在objective-c arc中使用属性?

于 2013-01-13T11:48:00.990 回答
0

首先,我尝试将 viewController.m 类导入另一个 .m 类并尝试检索该值,但我收到了链接器错误。

您从不导入 .m(实现)文件。您只能导入 .h(标头)文件。

我的问题是为什么 import 给了我错误

在 C 中,有一条规则是任何(非static)具有特定名称的全局函数或变量只能定义一次。对于一个变量,写它的类型和名称来定义它。对于一个函数,实现定义了它。因此,在两个不同的代码文件中具有相同名称的全局函数或变量将失败。他们会发生冲突。

导入文件意味着获取文件的整个源并将其插入其中。当您将 Am“导入”到 Bm 中时,Am 的整个源代码都将插入到 Bm 中。这意味着 Am 中的每个声明现在都显示在程序的两个代码文件中——Am 和 Bm,因此出现错误。

您可以多次声明(但不能定义)一个全局变量或函数。您可以通过使用声明变量extern而不定义它。声明它extern允许你使用一个变量,即使它实际上没有在同一个代码文件中声明。

以及外部变量如何识别该特定类的字符串名称?(即:如果我在不同的类中有 2 或 3 个具有相同名称的变量,并且我输入 extern 和字符串名称,我会得到哪个值,因为我没有导入任何类。)

如上所述,您的程序中只能有一个具有给定名称的非static全局变量。在不同的文件中具有相同名称的变量将是错误的。可以从程序的任何其他部分通过其名称访问非static全局变量和函数(并且它通过链接的魔力工作)。


通常,将在许多文件中使用的全局变量的最佳实践是在 .m 文件中定义它(就像您正在做的那样),并extern在与该 .m 文件对应的 .h 文件中声明它。然后导入该标头的其他文件将自动访问该变量。

于 2013-01-13T08:02:38.573 回答