2009-05-06 29 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