Obj-C - 在ivars和实例方法上调用和设置值

Obj-C - 在ivars和实例方法上调用和设置值

问题描述:

我不明白我在做什么错,因为我遵循一个指令书 - 设置调用类的方法的值。我有#进口它,一切都应该没问题。但是Xcode的抱怨:对“setWeightInKilos和‘setHeightInMeters不知道类方法选择人‘类,所以我不知道为什么会这样Obj-C - 在ivars和实例方法上调用和设置值

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

在Objective C中,有两种类型的方法。类方法,它不作用于对象,而是通常执行与该类型对象相关的某个任务。例如,内置用于测试网络连接,设备功能等的方法。这些方法总是用“+”号表示,不能在对象实例上调用,只能在类本身上调用。

其他类型,实例方法,更常见,并且对您自己创建的对象实例化或创建自己。这些是您在实现文件中用“ - ”前缀编写的方法。它们是你自己编写的getter,setter或方法。

在你的情况下,你需要在Person对象的实例上调用这些setter方法,而不是Person类本身。设置整个班级的高度或重量(也是不可能的)是没有意义的,因为每个物体都需要有自己独特的身高和体重。

你需要调用:

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

这些例如方法’,这些实例方法都在实现。’ ,不方法,因此,你应该使用变量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

它看起来像你想要设置实例变量,称为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