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

Objective c 如何在保留合成代码的同时向合成的getter/setter添加一些代码,objective-c,ios,declared-property,Objective C,Ios,Declared Property,例如,每次调用我的合成getter或setter时,我都需要执行NSLog(@“Executed”)。我认为有两种方法可以做到这一点: 找到一些可能与合成片段类似的片段。这可能有帮助 使用KVO:添加一些观察员来完成这项工作 对我来说,它们看起来都不干净。 所以,subc UPDAE:感谢您的回答,但直接覆盖不是解决方案: 我们需要松散的合成代码。如果我们从某个地方“复制粘贴”“正确”合成代码(甚至从apple engineer提供代码的apple论坛),我们应该检查它在下一个编译器版本后是否没

例如,每次调用我的合成getter或setter时,我都需要执行
NSLog(@“Executed”)
。我认为有两种方法可以做到这一点:

  • 找到一些可能与合成片段类似的片段。这可能有帮助
  • 使用KVO:添加一些观察员来完成这项工作
  • 对我来说,它们看起来都不干净。 所以,subc

    UPDAE:感谢您的回答,但直接覆盖不是解决方案:
    我们需要松散的合成代码。如果我们从某个地方“复制粘贴”“正确”合成代码(甚至从apple engineer提供代码的apple论坛),我们应该检查它在下一个编译器版本后是否没有更改。

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

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

    因此在您的界面中:

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

    您可以使用自定义getter和setter编写一个附加属性来完成自己的工作,然后访问@syntheticed属性,如下所示:

    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”作为属性,但您可以从@synthetic bar中获得所有细节。bar中的任何内容都将以线程安全的方式进行设置/获取,而bar2中的任何附加逻辑都不会(这对您来说可能无关紧要)

    直接重写是一种解决方案,它不是您喜欢的解决方案。KVO需要的更改较少,但如果您希望每个setter都使用此日志,则可能会变得混乱。这可能归结为个人偏好,但合成代码并不复杂。合成中的getter和setter并不神奇@特朗纳的回答是正确的,在接球手和二传手中没有更多的动作。如果你写的是ARC兼容的,你应该摆脱内存管理方法,它们不是魔法,是的。但是它们可能会改变,如果改变不可忽略,我不想返回并重写。很难看,但我没想过。我不认为它太难看。我会交换名称“bar”和“bar2”,这样您的代码就可以按照预期编写为set和get bar。如果/当您不再需要使用其他语句(如NSLog)时,您可以注释掉自定义setter和getter,并将@synthesized版本移回原位。但是您应该更改类结构。那太难看了。对这样一个小问题来说太多了。