Objective c 覆盖访问器getter方法的最简单方法?
考虑以下代码:Objective c 覆盖访问器getter方法的最简单方法?,objective-c,xcode4.2,Objective C,Xcode4.2,考虑以下代码: // MyClass.h @interface MyClass @property NSInteger Value; @end //MyClass.m @implementation MyClass @synthesize Value; @end 如果我只想覆盖值的合成setter方法,我需要进行哪些最小的代码修改 接下来,为了只覆盖合成的getter方法,我需要做哪些最小的修改 编辑 重写很简单。(参见下面的答案)在我的例子中,我收到了一个严重的警告,因为我
// MyClass.h
@interface MyClass
@property NSInteger Value;
@end
//MyClass.m
@implementation MyClass
@synthesize Value;
@end
如果我只想覆盖值的合成setter方法,我需要进行哪些最小的代码修改
接下来,为了只覆盖合成的getter方法,我需要做哪些最小的修改
编辑
重写很简单。(参见下面的答案)在我的例子中,我收到了一个严重的警告,因为我没有在属性定义中包含非原子属性。添加属性解决了导致此问题的最初问题。显然,不可能只覆盖原子属性的一个或另一个。必须将其更改为具有非原子属性
@property (nonatomic) NSInteger value;
五分钟前我还不知道,就我所能看到的任何地方都没有注意到
同时将名称更改为小写。ObjC中的约定适用于IVAR的较低首字母
除此之外,只要实现您想要的任何一个,编译器就会完成其余的工作。您可以有效地覆盖none、one或两者
只是一个获得者:
@implementation MyClass
@synthesize value;
- (NSInteger) value {
return value;
}
@end
只有二传手:
@implementation MyClass
@synthesize value;
- (void) setValue: (NSInteger)newValue {
value = newValue;
}
@end
对象类型(和覆盖原子性)的方法只是稍微复杂一些;这里有几个问题可以解释。显然,不可能只覆盖原子属性的一个或另一个。必须将其更改为具有非原子属性
@property (nonatomic) NSInteger value;
五分钟前我还不知道,就我所能看到的任何地方都没有注意到
同时将名称更改为小写。ObjC中的约定适用于IVAR的较低首字母
除此之外,只要实现您想要的任何一个,编译器就会完成其余的工作。您可以有效地覆盖none、one或两者
只是一个获得者:
@implementation MyClass
@synthesize value;
- (NSInteger) value {
return value;
}
@end
只有二传手:
@implementation MyClass
@synthesize value;
- (void) setValue: (NSInteger)newValue {
value = newValue;
}
@end
对象类型(和覆盖原子性)的方法只是稍微复杂一些;这里有几个问题可以解释。保持上面的一切不变(除了将值更改为值以标准化),然后您可以实现以下一项或两项:
-(NSInteger)value
{
return value;
}
-(void)setValue:(NSInteger)newValue
{
value = newValue;
}
值
自动创建为类字段。如果您使用的是保留对象,则需要手动保留/释放,除非您使用的是ARC。保持上述一切不变(除了将值更改为值
以标准化),然后您可以实现以下一项或两项:
-(NSInteger)value
{
return value;
}
-(void)setValue:(NSInteger)newValue
{
value = newValue;
}
值
自动创建为类字段。如果您使用的是保留的对象,则需要手动保留/释放,除非您使用的是ARC。我可以获得上述对象的修改示例吗。具体来说,我试图重写setter,但得到了一个可写原子属性“Value”,无法将合成的setter/getter与代码中用户定义的setter/getter
错误消息配对。谢谢。仅供参考,在我出错的情况下,将(非原子)
属性添加到我的属性中修复了警告。这很有趣。看起来你还得把它变成非原子的。我刚刚学到了一些东西!我想这可能是因为。长期从事程序员工作,但我对obj-c非常陌生。我猜编译器会抛出一个警告,因为合成的“原子”属性必须有特殊的代码,以确保线程间的一切安全。我还没有在我的应用程序中需要多线程,所以如果我需要的话,我会更深入地挖掘,并在遇到这个问题时跨越这座桥;这是如此罕见的必要。我可以得到一个修改后的样品上面的一个。具体来说,我试图重写setter,但得到了一个可写原子属性“Value”,无法将合成的setter/getter与代码中用户定义的setter/getter
错误消息配对。谢谢。仅供参考,在我出错的情况下,将(非原子)
属性添加到我的属性中修复了警告。这很有趣。看起来你还得把它变成非原子的。我刚刚学到了一些东西!我想这可能是因为。长期从事程序员工作,但我对obj-c非常陌生。我猜编译器会抛出一个警告,因为合成的“原子”属性必须有特殊的代码,以确保线程间的一切安全。我还没有在我的应用程序中需要多线程,所以如果我需要的话,我会更深入地挖掘,并在遇到这个问题时跨越这座桥;很少有必要这样做。