首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写@synthesize方法?

重写@synthesize方法?
EN

Stack Overflow用户
提问于 2011-06-27 20:33:15
回答 3查看 5.4K关注 0票数 1

我有一个叫狗的班级和一个叫猫的班级。

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-27 20:39:25

这个问题已经得到了很好的回答--详情请参见Objective-C synthesize property name overriding。特别是@Dev Kanchen的答案,其中包括示例代码。

票数 3
EN

Stack Overflow用户

发布于 2011-06-27 20:39:15

你所要做的就是离开@synthesize,然后创建你想要定制的任何方法。示例:

在.h中

代码语言:javascript
复制
@property(nonatomic, retain)NSString *Bob;

在.m中

代码语言:javascript
复制
@synthesize bob;

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

Stack Overflow用户

发布于 2011-06-27 20:36:04

您的不能覆盖(并在内部调用)来自同一个类中的合成方法。

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

如果您只是想在属性更改时执行其他(与不同的)操作,我可以使用KVO,只需将每个狗作为观察者添加到-(id)init;中它自己的"name"属性中。

编辑:

有一种方法可以将额外的逻辑添加到同一类中的合成方法中:

在类扩展中定义私有中间属性。

我已经附加了一个使用合成属性并小心的类的源代码(原文如此!)让狗的主人和它自己的身份保持同步。

Dog.h

代码语言:javascript
复制
#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.

代码语言:javascript
复制
#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

测试

代码语言:javascript
复制
Dog *dog = [[Dog alloc] init];
NSLog(@"%@", dog);
dog.name = @"Snoopy";
NSLog(@"%@", dog);
dog.name = @"Snowy";
NSLog(@"%@", dog);

结果:

代码语言:javascript
复制
<Dog name:'Snowy' owner:'Tintin'>
<Dog name:'Snoopy' owner:'Charlie Brown'>
<Dog name:'Snowy' owner:'Tintin'>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6492894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档