覆盖访问器getter方法的最简单方法是什么?

时间:2012-01-16 21:11:25

标签: objective-c xcode4.2

请考虑以下代码:

// MyClass.h
@interface MyClass
    @property NSInteger Value;
@end

//MyClass.m
@implementation MyClass
    @synthesize Value;
@end

如果我想覆盖 Value的合成setter方法,我需要做出哪些最小的代码修改?

作为后续行动,为了覆盖合成的getter方法,我必须做出哪些最小的修改?

修改

覆盖很简单。 (请参阅下面的答案。)在我的情况下,我收到一个令人讨厌的警告,因为我没有将nonatomic属性包含在我的属性定义中。添加属性已经解决了我的初始问题,导致了这个问题。

2 个答案:

答案 0 :(得分:3)

显然,不可能只覆盖原子属性中的一个或另一个。您必须将其更改为nonatomic属性。

@property (nonatomic) NSInteger value;

五分钟前我不知道,据我所知,TOCPL中的任何地方都没有注明。

同时将名称更改为小写。 ObjC中的惯例是较低的ivars首字母。

除此之外,只需实现您想要的任何一个,编译器将完成其余的工作。您可以有效地覆盖任何一个,一个或两个。

只是吸气者:

@implementation MyClass

@synthesize value;

- (NSInteger) value {
    return value;
}

@end

只是二传手:

@implementation MyClass

@synthesize value;

- (void) setValue: (NSInteger)newValue {
    value = newValue;
}

@end

对象类型(和覆盖原子性)的方法稍微复杂一些;这里有几个关于SO的问题,some info in the Apple docs将会解释。

答案 1 :(得分:1)

将所有内容保持原样(除了将Value更改为value以进行标准化),然后您可以实现以下一项或两项:

-(NSInteger)value
{
    return value;
}

-(void)setValue:(NSInteger)newValue
{
    value = newValue;
}

value会自动创建为类字段。如果您正在使用保留对象,则除非使用ARC,否则需要手动保留/释放。