我在类中创建了一个类别,该类别符合协议,该协议在其实现中需要一个属性。但是,因为我属于某个类别,所以我无法在该类别的实现中合成该属性。因此,我很难理解如何实现setter方法(当我保持协议的属性readonly它工作正常,因为我需要的只是一个访问器方法)。
这是我的协议:
@protocol SomeProtocol <NSObject>
@property (nonatomic) BOOL didDisplayRecommendation;
@end
我知道如果我这样做,我会得到一个无限循环:
- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation
{
self.didDisplayRecommendation = didDisplayRecommendation;
}
但是当我尝试这个时,我得到一个编译器错误:
- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation
{
_didDisplayRecommendation = didDisplayRecommendation;
}
请注意,didDisplayRecommendation是协议中的属性。解决这个问题的最佳方法是什么?提前谢谢!
答案 0 :(得分:2)
不允许您通过类别向类添加实例变量,请参阅https://stackoverflow.com/a/13000930/171933
由于您需要一个变量来保存didDisplayRecommendation
的值,因此您不希望使用某个类别(除非您想弄脏https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH3g-SW5)。
我建议您重新考虑一下您的架构,看看您是否真的需要使用类别。子类甚至Mixins可能是更好的方法。
答案 1 :(得分:0)
在协议中添加属性时,需要@synthesize它们。
答案 2 :(得分:0)
我有一个宏,可以让你在类别中声明“属性”:
@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
我用引号说“属性”,因为即使没有@property
声明也可以使用它们。该宏也可用于支持weak
。
您可以在此处检查实施(标题文件位于底部): http://nspicks.com/2013/12/15/cleaner-properties-implementation-in-categories/