在Cocoa / Obj-C项目中声明外部函数

时间:2009-05-06 02:10:48

标签: c objective-c cocoa function

好的,这里有。我已经完成了一个Cocoa基础工具,它可以计算随机整数的平均绝对偏差(就像学习项目一样)。

我已将计算移动到名为“findMeanAbsoluteDeviation()”的函数中。它接受NSNumber对象的NSMutableArray来执行计算。无论如何。因此,当我在与其他代码相同的“.m”文件中声明它时,这一切都很好用。

#import <Foundation/Foundation.h>

float findMeanAbsoluteDeviation(NSMutableArray * array);

int main (int argc, const char * argv[]) {
    ...generate random integers, execute function...
    meanAbsoluteDeviation = findMeanAbsoluteDeviation(numArray);
}

float findMeanAbsoluteDeviation(NSMutableArray * array) {
    ...mean absolute deviation maths...

}

它工作正常。现在,我想将该函数移动到外部文件。我创造了一个 NSObject的子类名为“mad”。我把这个函数移到我疯狂的“mad.m”中,我读了然后重新格式化了声明,看起来像

-(float)findMeanAbsoluteDeviation:(NSMutableArray *)array {
    ...code...
}

和我的“mad.h”文件。

@interface mad : NSObject {

}

    - (float)findMeanAbsoluteDeviation:(NSMutableArray *)array;

@end

似乎都很棒。对?我所要做的就是添加......

#import "mad.m"

到我的“main.m”文件的顶部,并像平常一样使用该函数。好吧,它似乎没有正确编译。

ld: duplicate symbol .objc_class_name_mad in ------standardDeviation.build/Debug/standardDeviation.build/Objects-normal/i386/mad.o and ------standardDeviation.build/Debug/standardDeviation.build/Objects-normal/i386/standardDeviation.o

“------”为了长度而省略

Command /Developer/usr/bin/gcc-4.0 failed with error code 1

有什么想法吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

您需要#import "mad.h",而不是#import "mad.m",否则会对类实现进行两次评估,因此您会看到错误。

一些风格点:

  • 如果你没有使用对象的实例变量,你通常会编写一个类方法(+)而不是实例方法( - )。
  • 如果一个类接口对你正在做的事情没有意义,那么在Objective-C头文件中声明一个C函数原型是没有问题的。有关示例,请参阅NSGeometry.h
  • 如果不在函数或方法中改变数组,请不要使用可变数组参数。
  • 考虑对类,方法和函数使用标准的Cocoa命名约定。

例如:

@interface MEMeanAbsoluteDeviation : NSObject {
}
+ (float)meanAbsoluteDeviation:(NSArray *)array;

或简单地说:

float MEMeanAbsoluteDeviation(NSArray *array);