Вы не можете переопределить (и вызвать его внутри) синтезированный метод из того же класса .
Однако вы можете переопределить его изподкласс (или, точнее: синтезировать его в абстрактном суперклассе ).
Если вы просто хотите выполнять дополнительные (по сравнению с другими) операции при изменении свойства, я бы использовал KVO , просто добавив каждую собаку в качестве наблюдателя к собственному свойству "name"
в -(id)init;
.
Редактировать:
Существует способ добавить дополнительную логику в синтезированныйметоды из этого же класса:
Определение частного промежуточного свойства в расширении класса.
Я приложил исходный код для класса, который использует синтезированные свойства и заботится (так!) о сохранении собачьеговладелец синхронизирован с собственной личностью.
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
Dog.m :
#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'>