我尝试过两种方式将全局变量的值从.m转换为另一种.m:
首先,我尝试在另一个.m类中导入viewController.m类并尝试检索该值,但是我收到了一个链接器错误。
其次,我只是用字符串名称创建了extern,然后它开始完美运行。
我的问题是为什么import会给我错误以及extern变量如何识别该特定类的字符串名称?
(即:如果我在不同的类中有2个或3个具有相同名称的变量,我输入extern和string name,因为我没有导入任何类,所以我会得到哪个值。)
并且,附加问题:什么时候你真的导入了这个课程?
答案 0 :(得分:1)
当您需要访问它的属性和方法时,您确实导入了一个类。这可能听起来太明显了,但事实就是如此。类是OOP的封装概念的化身。
从一个点到另一个点的变量可以通过多种方式完成,一个可以使用userdefaults工具,你可以在app委托中拥有变量然后访问不同类中的值,或者你可以在你的上面公开一个属性目标视图控制器并让源视图控制器在转换到目标之前设置该属性。仅举几例。根据场景,还有很多方法是对错的。
将视图控制器A导入到另一个视图控制器B中,只是为了访问A中的值似乎有点过分(如果不是对输入机制的不恰当使用)。
这个问题进一步解释了外部因素,我没有接触过它们,
Objective-C static, extern, public variables
希望这有帮助。
答案 1 :(得分:0)
首先,我尝试在另一个.m中导入viewController.m类 class并尝试检索该值但我收到了链接器错误。
您永远不会导入.m(实现)文件。您只能导入.h(标题)文件。
我的问题是为什么导入给了我错误
在C中,规则是任何(非static
)具有特定名称的全局函数或变量必须仅定义一次。对于变量,写入其类型和名称定义它。对于函数,实现定义它。因此,在两个不同的代码文件中具有相同名称的全局函数或变量将失败。他们会发生冲突。
导入文件意味着获取文件的整个源并将其插入。当你将A.m“导入”B.m时,将A.m的整个源插入到B.m.这意味着A.m中的每个声明现在都显示在程序中的两个代码文件中 - A.m和B.m,因此出错。
您可以多次声明(但不能定义)全局变量或函数。您可以使用extern
声明变量而不定义它。使用extern
声明它允许您使用变量,即使它实际上并未在同一代码文件中声明。
以及外部变量如何 识别该特定类的字符串名称? (即:如果 我在不同的类中有2个或3个具有相同名称的变量 输入extern和string name,因为我不是,所以我会得到哪个值 导入任何类。)
如上所述,您的程序中只能包含具有给定名称的一个非static
全局变量。在不同的文件中使用相同名称的变量是错误的。非static
全局变量和函数可以通过其名称从程序的任何其他部分访问(并且它通过链接的魔力工作)。
通常,将在许多文件中使用的全局变量的最佳实践是在.m文件中定义它(正如您所做的那样),并在.h中声明它extern
。该.m文件对应的文件。然后,导入该标头的其他文件将自动访问该变量。
答案 2 :(得分: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的创建,因此您不需要创建单独的变量声明,并且只需要创建自己的访问器(如果需要)更改默认行为。
请在此处参考我的回答:
Should I declare variables in interface or using property in objective-c arc?