2010-03-26 9 views
28

Chcę użyć kategorii do stworzenia metody na oryginalnej klasie dostępnej również jako własność.Kategorie celu C: Czy mogę dodać właściwość dla metody, która nie należy do mojej kategorii?

Klasa A:

@interface ClassA 
- (NSString*)foo; 
@end 

Klasa A kategoria

@interface ClassA (Properties) 
- (void)someCategoryMethod; 
@property (nonatomic, readonly) NSString *foo; 
@end 

Teraz, kiedy to zrobić, wydaje się działać (EDIT: Może to nie działa, to nie robi narzekać, ale widzę dziwność), ale to daje mi ostrzeżenia, ponieważ nie syntetyzuję własności w mojej kategorii realizacji. Jak mogę powiedzieć kompilatorowi, że wszystko jest w porządku, skoro oryginalna klasa syntetyzuje właściwość dla mnie?

+0

Właściwości są (głównie) tylko cukrem dla metody '-foo' i' -setFoo'. Nie można dodawać żadnych dodatkowych zmiennych instancji w kategoriach, ale można zdefiniować te metody. Składnia @property jest opcjonalna, ale sugerowana (nie jestem pewien, czy to działa). –

+1

Dla każdego, kto próbuje dodać nieruchomość z podłożem ivar (również w tej kategorii), zobacz: http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with- associative-references/ – Senseful

+0

możliwy duplikat [Objective-C: Property in Category] (http://stackoverflow.com/questions/8733104/objective-c-property-in-category) – hfossli

Odpowiedz

32

Oto ostrzeżenie dostajesz:

warning: property ‘foo’ requires method '-foo' to be defined - use @synthesize, @dynamic or provide a method implementation

Aby stłumić to ostrzeżenie, mieć to w swojej realizacji:

@dynamic foo;

+0

Właśnie tego potrzebowałem, dziękuję! –

1

Jeśli coś zostało zadeklarowane w interfejsie twojej kategorii, jego definicja należy do twojej kategorii.

+0

Ale nie mam dostępu do źródło 'ClassA'. Powiedzmy, że to klasa w UIKit, że "poprawiam". –

+0

Prawdopodobnie powinieneś tworzyć podklasę, a nie kategorię. –

+3

Jeśli jest to podklasa, wystąpienia tej klasy utworzone w obszarach, na których nie mam kontroli, nie będą miały tego kodu ani właściwości. –

1

napisałem dwa artykuły na ten temat, choć koncepcja różni się nieco od pytania, które zadajesz.

  1. Dodaj ogłoszenie do kategorii bez dotykania klasę bazową: http://compileyouidontevenknowyou.blogspot.com/2012/06/adding-properties-to-class-you-dont.html
  2. dostępu Ivars z kategorii: http://compileyouidontevenknowyou.blogspot.com/2012/06/if-you-want-to-keep-everything-in-your.html

To jest dużo lepiej niż metoda swizzling, co najmniej: sposób bezpieczniejszy.

Powiązane problemy