3

例如,我需要在NSLog(@"Executed.")每次调用合成的 getter 或 setter 时执行。我看到了两种方法:

  1. 找到一些可能像合成的片段一样工作的片段。该线程可能对此有所帮助。
  2. 使用 KVO:添加一些可以完成工作的观察者。

对我来说,所有这些看起来都不令人满意。所以,主题。

UPDAE:感谢您的回答,但直接覆盖不是解决方案:我们丢失了合成代码。如果我们从某个地方“复制粘贴”“正确”合成代码(甚至来自苹果工程师给我们代码的苹果论坛),我们应该检查它在下一次编译器发布后没有改变。

4

3 回答 3

3

您可以使用自定义的 getter 和 setter 编写一个附加属性,该属性执行您自己的操作,然后访问 @synthesized 属性,如下所示:

富.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

我建议您在合成属性中添加一个观察者,因为这将是最干净的解决方案。

如果您对这种方式不满意,您可能只想覆盖 getter/setter?

于 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 回答