【问题标题】:objective-c instance variablesObjective-C 实例变量
【发布时间】:2013-02-02 04:37:33
【问题描述】:

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

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

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的原始代码)

【问题讨论】:

  • "不会使用 @synthetize 创建实例变量“age”的 getter 和 setter?" 发布的代码不使用属性。此代码中没有@property@synthesize

标签: objective-c class variables methods instance


【解决方案1】:

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

另一个好处是你不能写信给age:你班级的用户可以得到age,但他们不能set它。

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

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

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

@property (nonatomic, readonly) int age;

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2011-05-07
      • 2014-09-16
      • 2013-03-01
      • 2012-07-08
      • 2014-08-12
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多