我有一个类,我在头文件中定义类扩展,如下所示:
@interface GCFriend : GCDataObject
@property (nonatomic, strong) NSString *firstName;
...
...
...
+ (NSOperation *)getFriendsCached:(void (^)(NSArray *cached))cached
fresh:(void (^)(BOOL success, NSArray *fresh))fresh;
@end
@interface GCFriend (Transient)
@property (nonatomic, strong) UIImage *image;
@end
现在,作为优先选择,我希望将该图像属性与主界面声明分开,因为它不是来自api的东西。但是,当我以这种方式声明时,我在调用getter方法时会得到一个无法识别的选择器。这是为什么?如果我将其移动到主界面声明,则没有问题。
答案 0 :(得分:6)
这不是类扩展。这是一个类别。类扩展通常放在类的实现文件中,格式为@interface GCFriend ()
- 空括号。您可以在类扩展中添加实例变量,但不能在类别中添加。 (这是因为类扩展是作为类的一部分编译的,而类别是分别编译和加载的。)
答案 1 :(得分:-1)
这很有趣。确实应该有警告。我想这是因为属性的隐式合成,但是对于在类别中声明的属性不起作用。
无论如何,您可以按原样保留头文件,但是您必须在.m
文件中明确编写属性getter和setter。
...
@interface GCFriend() {
UIImage *image; // create the ivar
}
@end
@implementation GCFriend (Transient)
- (UIImage *) image { // getter
return image ;
}
- (void) setImage:(UIImage *) img { // setter
image = img ;
}
@end