例如,每当我的合成getter或setter被调用时,我都需要执行NSLog(@"Executed.")
。我认为有两种方法可以做到:
对我来说,所有这些看起来并不令人满意。 所以,subj。
UPDAE:感谢您的回答,但直接覆盖不是解决方案: 我们松散了合成代码。如果我们从某个地方“复制粘贴”“正确”的合成代码(甚至从Apple工程师给我们代码的Apple论坛),我们应该检查它在下一个编译器发布后是否没有改变。
答案 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;
}
}