1

Objective-C のプロパティを使用すると、以下をコンパクトに定義できることを理解しています。

  1. セッター
  2. ゲッター
  3. データ

プロパティを使用したいのですが、ゲッター/セッターからデータを分離できればいいのですが。

つまり、私は Properties のgetter/setter インターフェイスが好きですが、 data の独自の内部表現を定義したいと考えています。

たとえば、MyOwnTime クラスを定義する場合、時間、日付、分などのプロパティのゲッター/セッターが必要です (消費者として、それらを設定および取得できるようにしたい)。ただし、日付、月、年、時、分、秒などを格納するのではなく、表現のメモリを節約するために、secondsSinceEpoch を unsigned long として格納することを好みます。

私の状況では、プロパティを使用する必要がありますか? どうすればいいですか?または、独自のセッターとゲッターを手動でロールする必要がありますか?

4

5 に答える 5

2

あなたは確かにこれを行うことができます. 確かに、それはかなり一般的です。データへのマッピングは直接的ではないため、メソッドを合成することはできず、ゲッターとセッターを手動で記述する必要があります。ただし、プロパティは他のプロパティと同様に機能します。

簡単なダミーの例として:

@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;

または、私の場合(.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";

呼び出しはまたはmyObject.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 に答える