我有一个名为dog的类,另一个名为cat的类。
Dog有一个变量,“name”在.h文件中用@property声明。
在cat类中,我在创建了dog类型的变量“myDog”后,使用命令myDog.name =“buster”设置了名称。
当通过覆盖通常由@synthesize命令创建的set方法设置名称时,我想执行其他操作。
我该怎么做?谢谢你的帮助!
答案 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);