【问题标题】:Setter method is not being called in Objective C在Objective C中没有调用Setter方法
【发布时间】:2012-07-07 04:20:48
【问题描述】:

当我为我的类重写 getter 和 setter,并在别处设置 miles 属性时,不会调用 setter 方法。我做错了什么?

我在这里调用miles 属性

// "entry" is an object that has a property of type CYDistance

if ([unitLabel.text isEqualToString:@"Miles"]) {
    entry.distance.miles = s.floatValue;
}
else if ([unitLabel.text isEqualToString:@"Kilometers"]) {
    entry.distance.kilometers = s.floatValue;
}
NSLog(@"Miles: %.2f", entry.distance.miles);
NSLog(@"Kilometers: %.2f", entry.distance.kilometers);

距离.h

#import <Foundation/Foundation.h>

@interface CYDistance : NSObject {
    float miles, kilometers;
}

@property float miles;
@property float kilometers;

@end

距离.m

#import "Distance.h"

@implementation CYDistance

- (float)miles {
    return miles;
}

- (float)kilometers {
    return kilometers;
}

- (void)setMiles:(float)m {
    miles = m;
    kilometers = m * 1.609344;
    NSLog(@"Set miles");
}

- (void)setKilometers:(float)k {
    kilometers = k;
    miles = k / 1.609344;
    NSLog(@"Set kilometers");
}

@end

【问题讨论】:

  • 您的实现是针对距离类的,而您的接口是针对类CYDistance的。在 CYDistance 中定义 getter 和 setter。
  • 显示您正在创建 CYDistance 实例并将其设置为 miles 属性的代码。
  • 去掉@dynamic 关键字,在这种情况下无论如何都不会使用它们,这只是令人困惑。请提供一个示例,说明您如何调用 setter。
  • 你几乎不想使用@dynamic。它的目的是相当具体的,不是很常见。
  • 您的 getter/setter 方法看起来正确。将 NSLog() 语句添加到您的 if/else if 语句中,以查看是否满足条件。

标签: objective-c methods overriding setter


【解决方案1】:

给定以下代码...

entry.distance.miles = s.floatValue;

...如果entry.distance 的值为nil,则不会调用miles 访问器。

【讨论】:

    【解决方案2】:

    尝试编写如下实现:

    #import "Distance.h"
    
    @implementation CYDistance
    
    @synthesize miles = _miles;
    @synthesize kilometers = _kilometers;
    
    - (void)setMiles:(float)m {
        _miles = m;
        _kilometers = m * 1.609344;
        NSLog(@"Set miles");
    }
    
    - (void)setKilometers:(float)k {
        _kilometers = k;
        _miles = k / 1.609344;
        NSLog(@"Set kilometers");
    }
    
    @end
    

    这样在引用 ivars 时不会出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多