1

几年前有一个关于实例与类方法的问题。用下面的代码说明了这一点。我大部分都理解,除了为什么我需要实例变量“age”和实例方法“age”?

实例变量“age”的getter 和setter 不会用@synthetize 创建吗?

Static int numberOfPeople = 0;

@interface MNPerson : NSObject {
     int age;  //instance variable
}

+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end

@implementation MNPerson
- (id)init{
    if (self = [super init]){
          numberOfPeople++;
          age = 0;
    }    
    return self;
}

+ (int)population{ 
     return numberOfPeople;
}

- (int)age{
     return age;
}

@end
main.m:

MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);

(来自@micmoo 的原始代码)

4

2 回答 2

5

实例方法age用于封装。它允许子类覆盖该方法,并在需要时提供不同的实现。例如,子类可能希望根据初始日期和当前日期计算年龄,而不是存储它。如果您使用实例变量,子类将无法覆盖age;如果您添加一个实例方法,那么子类将能够提供新的实现。

另一个优点是您不能写信给age:您班级的用户可以获得age,但他们不能set

实例变量“age”的getter 和setter 不会被创建@synthetize吗?

@synthesize需要一个属性声明,该类中缺少该声明。属性对于该语言来说相对较新,这可以解释为什么它们没有在您找到的代码中使用。

当前做同样事情的方法是声明一个属性而不是一个 ivar 和一个访问器,并完全跳过@synthesize

@property (nonatomic, readonly) int age;

age您可以通过分配_age自动创建的支持变量从类内部写入;用户可以使用[obj age]orobj.age语法读取值。

于 2013-02-17T18:41:01.293 回答
3

这段代码显然是在引入声明的属性和@sythesize指令之前编写的,它们是在 Mac OS X Leopard 时代用所谓的“Objective-C 2.0”引入的。The Cacao 有一个简短的介绍,它将向您展示旧方式的样子。

是的,用现代的方式做会好得多,但是在那些黑暗的时代,我们必须在类的接口中声明每个 ivar,并手动编写每个 setter 和 getter。每个人,在雪地里,双向上坡,没有靴子。

于 2013-02-17T18:40:17.850 回答