如何在保持合成代码的同时向合成的getter / setter添加一些代码

时间:2012-07-24 10:40:03

标签: objective-c ios declared-property

例如,每当我的合成getter或setter被调用时,我都需要执行NSLog(@"Executed.")。我认为有两种方法可以做到:

  1. 找一些可能像合成的片段一样工作的片段。 This thread可能会有所帮助。
  2. 使用KVO:添加一些可以完成工作的观察者。
  3. 对我来说,所有这些看起来并不令人满意。 所以,subj。

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

3 个答案:

答案 0 :(得分: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中的任何其他逻辑都不会(这对您来说无关紧要)

答案 1 :(得分:1)

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

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

答案 2 :(得分: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;
    }
}