3

たとえば、NSLog(@"Executed.")合成されたゲッターまたはセッターが呼び出されるたびに実行する必要があります。それを行うには2つの方法があります。

  1. おそらく合成されたもののように機能するスニペットをいくつか見つけてください。このスレッドはその助けになるかもしれません。
  2. KVOを使用する:作業を行うオブザーバーを追加します。

それらのすべては私にとって満足のいくきれいに見えません。だから、subj。

UPDAE:回答ありがとうございますが、直接オーバーライドすることは解決策ではありません。合成されたコードを失います。どこかから(アップルエンジニアがコードを提供するアップルフォーラムからでも)合成されたコードを「コピーアンドペースト」「正しく」する場合は、次のコンパイラリリース後に変更されていないことを確認する必要があります。

4

3 に答える 3

3

カスタムのgetterとsetterを使用して、独自の処理を行う追加のプロパティを記述し、次のように@synthesizedプロパティにアクセスできます。

Foo.h:

@interface Foo : NSObject
{
    int bar;
}

@property int bar;
@property int bar2;


@end

Foo.m:

#import "Foo.h"

@implementation Foo

@synthesize bar;

- (int) bar2
{
    NSLog(@"getter");
    return self.bar;
}

- (void) setBar2:(int)newBar
{
    NSLog(@"setter");
    self.bar = newBar;
}
@end

そしてあなたのコード:

Foo *foo = [[Foo alloc] init];
foo.bar2 = 1;
foo.bar2 += 2;
[foo release];

したがって、プロパティとして「bar2」を使用しますが、@synthesizedバーからすべての優れた機能を利用できます。bar内のすべてはスレッドセーフな方法で設定/取得され、bar2内の追加のロジックはそうではありません(これはあなたにとって重要ではないかもしれません)

于 2012-07-31T13:01:47.710 に答える
1

合成されたプロパティにオブザーバーを追加することをお勧めします。これが最もクリーンなソリューションになるからです。

この方法に満足できない場合は、ゲッター/セッターをオーバーライドするだけですか?

于 2012-07-24T10:47:07.910 に答える
1

だからあなたのインターフェースで:

@property (nonatomic, strong) NSString *testString;

そしてあなたの実装では:

@synthesize testString; //this is used to generate a setter/getter if we don't override one of them

-(NSString *)testString {
    NSLog(@"Executed.");
    return testString;
}

-(void)setTestString:(NSString *)newValue {
    NSLog(@"Executed.");
    if (testString != newValue){
        [newValue retain];
        [testString release];
        testString = newValue;
    }
}
于 2012-07-24T10:50:03.227 に答える