导入.m实现文件时出错

时间:2010-11-23 21:33:22

标签: iphone objective-c

我试图导入.m文件以使用在那里声明的静态变量到另一个类。

#import "Faculty.m"

我收到错误“没有这样的文件或目录”。 现在,在.m实现文件中声明变量可能是一个糟糕的编程习惯,但出于好奇,错误是什么呢? .m文件确实存在吗?为什么“没有这样的档案”呢?

4 个答案:

答案 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" (标头)文件,包含类和方法的声明。这些包含足够的信息,使编译器知道如何使一切工作。