我试图导入.m文件以使用在那里声明的静态变量到另一个类。
#import "Faculty.m"
我收到错误“没有这样的文件或目录”。 现在,在.m实现文件中声明变量可能是一个糟糕的编程习惯,但出于好奇,错误是什么呢? .m文件确实存在吗?为什么“没有这样的档案”呢?
答案 0 :(得分:7)
如果导入的文件与import命令所在的文件不在同一目录中,编译器将使用项目的* .hmap文件来定位它。此文件由XCode自动生成,仅包含* .h文件的位置。
如果* .m文件与包含#import命令的文件位于同一目录中,那么您的导入命令将起作用(或者至少不会生成未找到的错误)。
答案 1 :(得分:2)
听起来你的.m文件不是当前目录以及预处理器知道查找标头的目录。或者可能是导入Faculty.m会创建一个循环依赖项,也会产生该错误。
但是你要做的几乎肯定是甚至不会工作,即使你要编译它。大多数情况下,导入实现文件会导致在程序中多次定义函数,类和方法,这是无效的并且会搞砸您的编译。但即使假设这里没有出现,你也要记住#include
和#import
的工作原理 - 他们只是将命名文件复制并粘贴到当前文件中。这意味着如果Faculty.m有一个名为“foo”的静态变量,并且该文件由Student.m和Administrator.m导入,那么Faculty.m将有一个名为“foo”的静态静态变量,Student.m将有一个名为“foo”的完全不同且不相关的静态变量和Administrator.m将还有另一个名为“foo”的无关静态变量。
正确的方法是在Faculty.m中使用非静态变量,在Faculty.h中声明变量extern
,并拥有另一个.m需要使用变量import Faculty.h。
答案 2 :(得分:1)
尝试:
#import "Faculty.h"
有了这个Falculty文件:
// Faculty.h
@interface Faculty : NSObject {
}
+ (VarType*)variable;
+ (void)setVariable:(VarType*)newVariable;
@end
// Faculty.m
#import "Faculty.h"
static VarType* variable;
@implementation Faculty
+ (VarType*)variable {
return variable;
}
+ (void)setVariable:(VarType*)newVariable {
if (variable != newVariable) {
[variable release];
variable = [newVariable copy];
}
}
@end
答案 3 :(得分:0)
通常" .m" -files(模块)不会导入。而是导入" .h" (标头)文件,包含类和方法的声明。这些包含足够的信息,使编译器知道如何使一切工作。