2012-07-16 58 views
2

我不明白我在做什麼錯,因爲我遵循一個指令書 - 設置調用類的方法的值。我有#進口它,一切都應該沒問題。但是Xcode的抱怨:對「setWeightInKilos和‘setHeightInMeters不知道類方法選擇人‘類,所以我不知道爲什麼會這樣Obj-C - 在ivars和實例方法上調用和設置值

Person *aPerson = [[Person alloc] init]; 
    [Person setWeightInKilos:96]; 
    [Person setHeightInMeters:1.8]; 
    float bmi = [Person bodyMassIndex]; 

回答

2

在Objective C中,有兩種類型的方法。類方法,它不作用於對象,而是通常執行與該類型對象相關的某個任務。例如,內置用於測試網絡連接,設備功能等的方法。這些方法總是用「+」號表示,不能在對象實例上調用,只能在類本身上調用。

其他類型,實例方法,更常見,並且對您自己創建的對象實例化或創建自己。這些是您在實現文件中用「 - 」前綴編寫的方法。它們是你自己編寫的getter,setter或方法。

在你的情況下,你需要在Person對象的實例上調用這些setter方法,而不是Person類本身。設置整個班級的高度或重量(也是不可能的)是沒有意義的,因爲每個物體都需要有自己獨特的身高和體重。

你需要調用:

Person *aPerson = [[Person alloc] init]; 
[aPerson setWeightInKilos:96]; 
[aPerson setHeightInMeters:1.8]; 
float bmi = [aPerson bodyMassIndex]; 
3

這些例如方法’,這些實例方法都在實現。’ ,不方法,因此,你應該使用變量aPerson的名稱來調用它們的實例,而不是類Person的名字:

Person *aPerson = [[Person alloc] init]; 
[aPerson setWeightInKilos:96]; 
[aPerson setHeightInMeters:1.8]; 
float bmi = [aPerson bodyMassIndex]; 

一般情況下,所有的方法聲明d前面的-帶有一個該類的實例的變量;用+聲明的方法取類名稱。

還有,如果heightInMetersweightInKilos被聲明爲屬性,你可以使用替代語法:你可以寫

aPerson.weightInKilos = 96; 
aPerson.heightInMeters = 1.8; 

這僅僅是同樣的事情,雖然不同的語法;在兩種情況下都會調用setter方法。

+0

當然!我應該看到...謝謝。 – 2012-07-16 03:39:49

2

它看起來像你想要設置實例變量,稱爲weightheight。所以要修復它,請執行以下操作:

Person *aPerson = [[Person alloc] init]; 
[aPerson setWeightInKilos:96]; 
[aPerson setHeightInMeters:1.8]; 
+1

爲什麼downvote? – pasawaya 2012-07-16 03:44:20

+0

+1爲什麼會有人下降呢?這是一個非常好的答案! – dasblinkenlight 2012-07-16 03:45:40