Objective c 如何在保留合成代码的同时向合成的getter/setter添加一些代码
例如,每次调用我的合成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论坛),我们应该检查它在下一个编译器版本后是否没
NSLog(@“Executed”)
。我认为有两种方法可以做到这一点:
我们需要松散的合成代码。如果我们从某个地方“复制粘贴”“正确”合成代码(甚至从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版本移回原位。但是您应该更改类结构。那太难看了。对这样一个小问题来说太多了。