覆盖@synthesize方法?

时间:2011-06-27 12:33:15

标签: iphone objective-c xcode ipad

我有一个名为dog的类,另一个名为cat的类。

Dog有一个变量,“name”在.h文件中用@property声明。

在cat类中,我在创建了dog类型的变量“myDog”后,使用命令myDog.name =“buster”设置了名称。

当通过覆盖通常由@synthesize命令创建的set方法设置名称时,我想执行其他操作。

我该怎么做?谢谢你的帮助!

3 个答案:

答案 0 :(得分:5)

您所要做的就是离开@synthesize,然后创建您想要自定义的方法。例如:

在.h

@property(nonatomic, retain)NSString *Bob;

在.m

@synthesize bob;

-(void)setBob:(NSString *)bobValue{
    [bobValue retain];
    [bob release];
    bob = bobValue;
    //your custom stuffs here
}

答案 1 :(得分:3)

这已经在SO上得到了相当多的回答 - 详见Objective-C synthesize property name overriding。特别是,@ Dev Kanchen的答案包括示例代码。

答案 2 :(得分:1)

无法覆盖(并在其中调用)来自同一类内的合成方法

但是你可以从子类覆盖它(或者更确切地说:在抽象超类中合成它)。

如果您只想在属性更改时执行其他(与不同的)操作,我会使用 KVO ,只需将每只狗作为观察者添加到{{1}中自己的"name"属性中}}


编辑:

有一种方法可以在同一个类中为合成方法添加额外的逻辑:
在类扩展中定义私有中间属性。

我附上了一个使用合成属性的类的源代码,并注意(原文如此!)让狗主人与自己的身份保持同步。

<强> Dog.h

-(id)init;

<强> Dog.m

#import <Foundation/Foundation.h>

@interface Dog : NSObject {
@private
    NSString *name;
    NSString *owner;
}

@property (nonatomic, readwrite, retain) NSString *name;
@property (nonatomic, readwrite, retain) NSString *owner;

@end

<强>测试

#import "Dog.h"

@interface Dog ()

@property (nonatomic, readwrite, retain) NSString *primitiveName;

@end

@implementation Dog

@dynamic name;

@synthesize primitiveName = name;
@synthesize owner;

- (id)init {
    if ((self = [super init])) {
        name = @"Snowy";
        owner = @"Tintin";
    }

    return self;
}

- (void)dealloc {
    [super dealloc];
}

- (NSString *)name {
    return self.primitiveName;
}

- (void)setName:(NSString *)aName {
    self.primitiveName = aName;
    if ([aName isEqualToString:@"Snoopy"]) {
        self.owner = @"Charlie Brown";
    }
    else if ([aName isEqualToString:@"Snowy"]) {
        self.owner = @"Tintin";
    }
}

- (NSString *)description {
    return [NSString stringWithFormat:@"<%@ name:'%@' owner:'%@'>", [self class], self.name, self.owner];
}

@end

结果:

Dog *dog = [[Dog alloc] init];
NSLog(@"%@", dog);
dog.name = @"Snoopy";
NSLog(@"%@", dog);
dog.name = @"Snowy";
NSLog(@"%@", dog);