1

我了解 Objective-C 中的属性允许我们紧凑地定义:

  1. 二传手
  2. 吸气剂
  3. 数据

我想使用属性,但如果我可以将数据与 getter/setter 分离,那就太好了。

换句话说,我喜欢 Properties 的getter/setter 接口,但我想定义自己的 data 内部表示

例如,如果我要定义 MyOwnTime 类,我想要获取小时、日期和分钟等属性的获取器/设置器(作为消费者,我希望能够设置并获取它们)。但是,为了节省表示中的内存,而不是存储日期、月份、年份、小时、分钟、秒等......,我更喜欢将 secondsSinceEpoch 存储为无符号长整数。

在我的情况下,我应该/我可以使用属性吗?我该怎么做?或者我应该手动滚动我自己的 setter 和 getter?

4

5 回答 5

2

你当然可以做到这一点。确实,这很常见。由于映射到数据不是直接的,因此您无法合成方法,您必须手动编写 getter 和 setter。但是该属性将像其他任何属性一样工作。

作为一个简单的虚拟示例:

@interface BytePair
{
    UInt16 data;
}

@property UInt8 loByte;
@property UInt8 hiByte;
@end

@implementation BytePair

- (UInt8) loByte
{
    return (UInt8) data & 0xff;
}

- (void) setLoByte:(UInt8)lo
{
    data = (data & 0xff00) | lo;
}

- (UInt8) hiByte
{
    return (UInt8) (data & 0xff00) >> 8;
}

- (void) setHiByte:(UInt8)lo
{
    data = (data & 0xff) | (lo << 8);
}

@end

管他呢。你明白了。

于 2012-10-22T09:27:50.000 回答
1

当然可以 :

@interface MyObject : NSObject
{
  int toto;
}

@property(nonatomic, setter=mySetterMethod:, getter=myGetterMethod) int toto;

-(void) mySetterMethod:(int) t;
-(void) myGetterMethod;

或者您也可以覆盖 setter 和 getter 默认方法,在我的情况下(在 .m 文件中):

-(int) toto
{
  return toto;
}

-(void) setToto:(int) t
{
  toto = t;
}
于 2012-10-22T09:37:55.333 回答
1

声明一个

@property (nonatomic, assign) sometype somename

在界面中正常。然后代替写作

@sythesize somename = _somename

在实现中,你写

-(sometype)somename {
    return whatever;
}

-(void)setSomename(sometype)newValue {
    whatever;
}
于 2012-10-22T09:40:24.210 回答
0

您根本不需要使用 @property 表示法。只需这样做:

@interface MyObject

- (id)foo;
- (void)setFoo:(id)newFoo;

@end

然后,你可以在其他地方做myObject.foo = @"bar";.

调用与ormyObject.foo完全相同。它与属性无关,只是碰巧最常用于它们。[myObject foo][myObject setFoo:foo]

@property语法只是声明属性的一种正式方式,允许您执行更高级的操作(例如)nonatomic。如果您要定义自己的方法,而不是让编译器为您定义它们,那么使用@property.

如果您禁用了 ARC,那么您可能想研究如何正确地管理内存,因为在一些不明显的边缘情况下,您可能会在定义自己的数据存储代码时遇到麻烦。

于 2012-10-22T09:44:56.617 回答
0

你可以,这很常见,而且很容易做到。

与标准属性一样,您甚至不需要为此声明实例变量并且仍然可以使用@synthesize您的属性(与其他答案所说的相反),您只需覆盖属性的设置器:

@interface MyObject : NSObject
@property(nonatomic, copy) NSString* myprop; // like any other property
@property(nonatomic, readonly) BOOL hasProp;
@end


@implementation MyObject
@synthesize myprop = _myprop; // optional with latest LLVM compiler, will generate the _myprop instance variable at compile time

// Override default setter for myprop
-(void)setMyprop:(NSString*)newvalue
{
    if (_myprop != newvalue)
    {
        [_myprop release]; // release only necessary if not using ARC
        _myprop = [newvalue retain]; // retain only necessary if not using ARC
        // And/Or whatever you want your custom setter to do
    }
}

// You can override default "-(NSString*)myprop" getter too if you want
// You you can keep the default getter implementation and only override the setter.
// Or vice-versa. It's really up to you

// Another example: we created a @property(readonly) hasProp and implement its getter by ourselves, without any dedicated instance variable

-(BOOL)hasProp
{
    return (self.myprop != nil);
}
@end
于 2012-10-22T09:46:09.357 回答