Переопределить метод @synthesize? - PullRequest
1 голос
/ 27 июня 2011

У меня есть один класс, который называется собака, и другой класс, который называется кошка.

У собаки есть переменная "name", объявленная с помощью @property в файле .h.

В классе cat я установил имя с помощью команды myDog.name = "buster" после создания переменной "myDog" типа dog.

Я хотел бы выполнять дополнительные операции, когда имя задается путем переопределения метода set, обычно создаваемого командой @synthesize.

Как я могу это сделать? Спасибо за помощь!

Ответы [ 3 ]

5 голосов
/ 27 июня 2011

Все, что вам нужно сделать, это оставить @synthesize, а затем создать любые методы, которые вы хотите использовать.Пример:

In .h

@property(nonatomic, retain)NSString *Bob;

In .m

@synthesize bob;

-(void)setBob:(NSString *)bobValue{
    [bobValue retain];
    [bob release];
    bob = bobValue;
    //your custom stuffs here
}
3 голосов
/ 27 июня 2011

На SO уже получен большой ответ - см. Objective-C синтезирует имя свойства, переопределяющее , для подробностей.В частности, ответ @Dev Kanchen, включающий пример кода.

1 голос
/ 27 июня 2011

Вы не можете переопределить (и вызвать его внутри) синтезированный метод из того же класса .

Однако вы можете переопределить его изподкласс (или, точнее: синтезировать его в абстрактном суперклассе ).

Если вы просто хотите выполнять дополнительные (по сравнению с другими) операции при изменении свойства, я бы использовал 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'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...