Расширение свойств, созданных с помощью @synthesize в Objective-C - PullRequest
1 голос
/ 28 марта 2009

Предположим, у меня @property объявлен так:

@property (readwrite,retain) NSObject *someObject;

И я синтезирую это так:

@synthesize someObject = _someObject;

Это генерирует геттеры / сеттеры для меня. Кроме того, согласно документам, сеттер будет иметь встроенный код безопасности потока.

Теперь предположим, что я хочу добавить код в метод setSomeObject :. Есть ли способ, которым я могу расширить существующий от @synthesize? Я хочу иметь возможность повторно использовать код безопасности потока, который он генерирует автоматически.

Ответы [ 2 ]

3 голосов
/ 03 июля 2012

Вы можете определить синтезированное "частное" свойство (поместите его в файл .m)

@interface ClassName ()

// Declared properties in order to use compiler-generated getters and setters
@property (nonatomic, strong <or whatever>) NSObject *privateSomeObject;

@end

, а затем вручную определите геттер и сеттер в «публичной» части ClassName (.h и @implementation part), например,

- (void) setSomeObject:(NSObject *)someObject {
  self.privateSomeObject = someObject;
  // ... Additional custom code ...
}

- (NSArray *) someObject {
  return self.privateSomeObject;
}

Теперь вы можете получить доступ к «свойству» someObject как обычно, например, object.someObject. Вы также получаете преимущество автоматически генерируемой retain / release / copy, совместимость с ARC и практически не теряете поточную безопасность.

1 голос
/ 28 марта 2009

То, что делает @synthesize, эквивалентно:

-(void)setSomeObject:(NSObject *)anObject {
    [anObject retain];
    [someObject release];
    someObject = anObject;
}

или

-(void)setSomeObject:(NSObject *)anObject {
    if(someObject != anObject) {
        [someObject release];
        someObject = [anObject retain];
    }
}

чтобы вы могли использовать этот код и расширить метод.

Однако, как вы сказали, этот код не может быть потокобезопасным.

В целях безопасности потоков вы можете взглянуть на NSLock или @synchronized (спасибо unwesen за указание на это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...