2009-05-06 46 views
0

好的,这里有。我已经完成了一个Cocoa基础工具,可以计算随机整数的平均绝对偏差(就像学习项目一样)。在Cocoa/Obj-C项目中声明外部函数

我已将计算移入名为“findMeanAbsoluteDeviation()”的函数中。它接受NSMumber对象的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... 

}

,它工作正常。现在,我想将该功能移至外部文件。我创建了一个名为“mad”的NSObject子类 。我搬到功能为我狂“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 

任何想法?谢谢你的帮助!

回答

3

你想要#import "mad.h"而不是#import "mad.m"否则类实现将被评估两次,因此你看到的错误。

几个风格要点:

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

例如:

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

或简单地:

float MEMeanAbsoluteDeviation(NSArray *array); 
+0

确定。我很喜欢Stack Overflow。非常感谢。我改变了我的“#import”声明。 然后我读了(http://www.otierney.net/objective-c.html)上的类方法,我想知道+和 - 之间有什么区别。非常感谢。我永远感谢:) 还有一个问题,如果我的函数接受NSArray,我可以传递它一个NSMutableArray,因为它是NSArray的子​​类,或者我应该NSAray * copyArray = [NSArray initWithArray:myMutableArray]; ?我很确定它的前者。 – 2009-05-06 02:49:32