目标C中没有调用Setter方法
问题描述:
当我重写我的类的getters和setters,并在别处设置miles
属性时,不会调用setter方法。我究竟做错了什么?目标C中没有调用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);
Distance.h
#import <Foundation/Foundation.h>
@interface CYDistance : NSObject {
float miles, kilometers;
}
@property float miles;
@property float kilometers;
@end
Distance.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
答
试着写执行情况如下:
#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时没有错误。
答
考虑下面的代码...
entry.distance.miles = s.floatValue;
...如果entry.distance
值为nil
,则miles
访问将不会被调用。
您的实现是针对Class Distance的,而您的接口是针对CYDistance类的。在CYDistance中定义getter和setter。 – 2012-07-06 17:15:26
显示您要创建CYDistance实例的代码并将其设置为“英里”属性。 – Caleb 2012-07-06 17:37:18
删除@dynamic关键字,无论如何它们在这种情况下都不会被使用,这只是令人困惑。请提供一个例子,说明你是如何致电二传手的。 – uvesten 2012-07-06 17:37:37