我有一个叫狗的班级和一个叫猫的班级。
Dog在.h文件中有一个用@property声明的变量"name“。
在cat类中,在创建了类型为dog的变量"myDog“之后,我使用命令myDog.name = "buster”设置了名称。
当设置名称时,我希望通过覆盖通常由@synthesize命令创建的set方法来执行其他操作。
我该怎么做呢?谢谢你的帮助!
发布于 2011-06-27 20:39:25
这个问题已经得到了很好的回答--详情请参见Objective-C synthesize property name overriding。特别是@Dev Kanchen的答案,其中包括示例代码。
发布于 2011-06-27 20:39:15
你所要做的就是离开@synthesize,然后创建你想要定制的任何方法。示例:
在.h中
@property(nonatomic, retain)NSString *Bob;在.m中
@synthesize bob;
-(void)setBob:(NSString *)bobValue{
[bobValue retain];
[bob release];
bob = bobValue;
//your custom stuffs here
}发布于 2011-06-27 20:36:04
您的不能覆盖(并在内部调用)来自同一个类中的合成方法。
但是,您可以从一个子类(或者更确切地说:在一个抽象超类中合成它)覆盖它。
如果您只是想在属性更改时执行其他(与不同的)操作,我可以使用KVO,只需将每个狗作为观察者添加到-(id)init;中它自己的"name"属性中。
编辑:
有一种方法可以将额外的逻辑添加到同一类中的合成方法中:
在类扩展中定义私有中间属性。
我已经附加了一个使用合成属性并小心的类的源代码(原文如此!)让狗的主人和它自己的身份保持同步。
Dog.h
#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.m Dog.
#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);结果:
<Dog name:'Snowy' owner:'Tintin'>
<Dog name:'Snoopy' owner:'Charlie Brown'>
<Dog name:'Snowy' owner:'Tintin'>https://stackoverflow.com/questions/6492894
复制相似问题