La categoría iOS se ajusta a un protocolo con properties: cómo implementar

Tengo una categoría en una class que hice, y esa categoría cumple con un protocolo, que requiere una propiedad en su implementación. Sin embargo, como estoy en una categoría, no puedo sintetizar la propiedad en la implementación de la categoría. Debido a esto, no se me ocurre cómo implementar el método setter (cuando conservo la propiedad del protocolo solo funciona bien, ya que todo lo que necesito es un método de acceso).

Este es mi protocolo:

@protocol SomeProtocol <NSObject> @property (nonatomic) BOOL didDisplayRecommendation; @end 

Sé que si hago esto obtendré un bucle infinito:

 - (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation { self.didDisplayRecommendation = didDisplayRecommendation; } 

Pero cuando bash esto obtengo un error de compilation:

 - (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation { _didDisplayRecommendation = didDisplayRecommendation; } 

Tenga en count que didDisplayRecommendation es la propiedad en el protocolo. ¿Cuál es la mejor forma de solucionar esto? ¡Gracias por adelantado!

No tiene permitido agregar variables de instancia a una class a través de categorías, consulte https://stackoverflow.com/a/13000930/171933.

Dado que necesita una variable para mantener el valor de didDisplayRecommendation , no tiene suerte de hacer esto con una categoría (a less que quiera contaminarse https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ ObjCRuntimeRef / Referencia / reference.html # // apple_ref / doc / uid / TP40001418-CH3g-SW5 ).

Recomiendo volver a pensar tu architecture para ver si realmente necesitas usar categorías. Las subclasss o incluso las Mixins podrían ser el mejor path a seguir.

Cuando agrega properties en un protocolo, necesita @ sintetizarlas.

Tengo una macro que te permite declarar "properties" en categorías como esta:

 @implementation NSObject (AwesomeUtils) JESynthesize(assign, NSInteger, index, setIndex); JESynthesize(strong, NSString *, name, setName); JESynthesize(copy, void(^)(void), completion, setCompletion); JESynthesize(unsafe_unretained, id, unsafeObject, setUnsafeObject); JESynthesize(weak, id<UITableViewDelegate>, delegate, setDelegate); JESynthesize(strong, NSString *, readonlyID, changeReadonlyID); // … @end 

Digo "properties" con comillas porque puedes usarlas incluso sin la statement @property . La macro también funciona para soportar weak .

Puede verificar la implementación aquí (los files de encabezado se encuentran en la parte inferior): http://nspicks.com/2013/12/15/cleaner-properties-implementation-in-categories/